셸(Shell) - 사용자와 리눅스 시스템 사이의 경계면 역할을 하는 프로그램
- 사용자가 셸을 통해서 명령을 내리면 시스템이 그 명령을 수행
리눅스의 표준 셸은 항상 /bin/sh에 설치
GNU 소프트웨어의 하나인 bash(GNU Bourn-Again SHell) 이다
bash는 리눅스 시스템에 항상 설치, 오픈소스
셸이 /bin/sh에 설치
사용자 로그인시 기본적으로 실행되는 셸도 바로 그것
기본 셸인 /bin/sh/ 프로그램은 사실 /bin/bash 프로그램의 링크
지금 구현하는 프로그램은 동영상 파일을 입력 받아 처음의 다섯 프레임을 ppm 파일로 저장하는 프로그램이다
프로그램의 큰 흐름은 다음과 같다
- 파일을 연다. - FileOpen( )
- 스트림의 정보를 얻는다. - GetStreamInformation( )
- 코텍을 찾는다 - FindCodec( )
- 디코딩한다 - Decode( )
Streamer 클래스를 선언하고 다음과 같이 구현한다
생성자 멤버 변수는 생성자에서 다음과 같이 설정한다
소멸자는 다음과 같이 구현한다
파일을 여는 함수는 다음과 같이 구현한다
스트림의 정보를 얻는 함수는 다음과 같이 구현한다
코덱을 찾는 함수는 다음과 같이 구현한다
디코딩하는 함수는 다음과 같이 구현한다
프레임을 저장하는 함수는 다음과 같이 구현한다
미디어 타입을 문자열로 변환하는 함수는 다음과 같이 구현한다
나머지 하나의 함수는 다음과 같이 구현한다
main( ) 함수는 다음과 같이 구현한다
FFMPEG 라이브러리 파일 다운로드
위의 링크로 들어가서 빌드된 다음 파일을 다운 받는다
파일을 다운 받은 후 압축을 푼다
Shared 폴더 안에서 bin 파일을 복사하여 링크를 한다
Dev 폴더 안에서 include, lib를 복사하여 링크를 한다
다음의 헤더파일을 포함한다
extern "C"{
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
}
필요한 라이브러리만 링크하면 되지만 다음의 파일을 링크한다
lib 파일
avcodec.lib
avdevice.lib
avformat.lib
avutil.lib
postproc.lib
swresample.lib
swscale.lib
CentOS7을 설치하는 과정에서 네트워크 디바이스 이름이 enp2s0, em0 등
예상하지 못한 이름을 보게 될 것이다.
요즘 서버 시스템은 내장 네트워크 카드, PCI 네트워크 카드, USB 네트워크 카드등
다양한 장치를 장착하고 있다.
전통적인 ethx 방식의 네트워크 이름은 다양한 네트워크 인터페이스를
구분하기 어려운 점이 있고 장치추가, 제거 시 이름이 바뀌는 경우도 있었다
이러한 문제를 해결하기 위해 CentOS7부터는 일관된 네트워크 디바이스 이름과
예측 가능한 네트워크 디바이스 이름을 제공한다
CentOS7의 systemd는 다음과 단계로 네트워크 인터페이스 이름을 명명한다
1. 펌웨어 또는 BIOS에서 온보드(on-board) 네트워크 디바이스에 대해
인덱스 번호를 제공한다면 온보드 디바이스 순서에 따라 명명한다. 예)eno1
2. 펌웨어 또는 BIOS에서 PCI 익스프레스 핫 플러그 슬롯 인덱스 번호를 제공한다면
핫 플러그 슬롯 인덱스에 따라 명명한다 예) ens1
3. 하드웨어 커넥터의 물리적 위치에 따라 명명한다 예) enp2s0
4. 네트워크 인터페이스 MAC 주소에 따라 명명한다.
이 방법은 사용자가 선택한 경우가 아니라면, 기본적으로 사용되지 않는다.
예) enxbc5ff41dfaa9
5. 위 모든 방법으로 명명하지 못한 경우 고전적인 방법으로 명명한다 예)eth0
포맷 | 설명 | 예 |
o<index> | 온보드 디바이스 | eno1 |
s<slot>[f<function>][d<dev_id>] | 핫플러그 슬롯 인덱스 | ens1 |
x<MAC> | MAC 주소 | enxbc5ff41dfaa9 |
p<bus>s<slot>[f<function>][d<dev_id>] | PCI 위치 | enp2s0 |
p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>] | USB 포트 넘버 | enp3s5 |
디바이스 | 예전이름 | 일관된 네트워크 디바이스 이름 | 예 |
임베디드 네트워크 인터페이스(LOM) | ethx | emx | em0 |
PCI 카드 네트워크 인터페이스 | ethx | p<슬롯>p<이더넷 포트> | p3p2 |
가상 function | ethx | p<슬롯>p<이더넷 포트>_<가상인터페이스> | p3p2_1 |
전통적으로 리눅스에서, 네트워크 디바이스는 ethX의 이름이 주어진다
여기에서 X는 0부터 시작해서 증가하는 정수다.
이것의 결점은 어느 물리적 네트워크 포트가 어느 ethX 이름을 가질 것인지
알 수 있는 결정적인 또는 일치하는 방법이 없다
여기서의 가정은 네트워크 매니저(NetworkManager)는 삭제되었고
네트워크 대몬(Network Daemon)이 사용될 것이다
다음 스텝을 따른다
1. 각각의 인터페이스에 할당되는 네트워크 디바이스 이름을 정하라
2. /etc/udev/rules.d/70-persistent-net.rules 파일을 생성하라
( vi /etc/udev/rules.d/70-persistent-net.rules)
3. 현재의 맵을 생성하기 위한 각각의 네트워크 인터페이스에 원하는 이름을 넣고 빼라
4. 원하는 이름을 반영하기 위해 /etc/sysconfig/network-scripts/ifcfg-X 를 이름을 바꾸고 변경하라.
5. 맥 주소와 디바이스 이름 맵을 생성하기 위해 /etc/udev/rules.d/70-persistent-net/rules 파일을 편집하라
6. 이 변경을 적용하기 위해 머신을 재부팅해라