Concept of Linux Programming
파일과 파일 시스템 리눅스는 모든 것이 파일이다. 따라서 모든 인터렉션은 실제로 파일을 읽고 쓰면서 이루어진다. 파일에 접근하려면 먼저 파일을 열어야 한다. 이렇게 열린 파일은 그 파일에 대한 메타 데이터와 연결된 고유한 기술자를 통해 참조하는데 이 기술자는 정수 타입으로 표현되며, 파일 디스크립터(fd)라고 불린다.
특수 파일 파일로 표현되는 커널 객체를 말한다. 리눅스는 다음 4가지 종류를 지원한다.
a. 블록 디바이스 파일
b. 케릭터 디바이스 파일
c. 네임드 파이프
d. 유닉스 도메인 소켓
a,b 모두 하드웨어 장비 조작에 속함.
a : 바이트 배열로 접근, 여러 바이트를 맵핑하여 사용가능.
b : 선형 큐 처럼 사용하며, 대표적인 디바이스는 키보드.
c : 시스템 콜로 만들어지는 일반 파이프는 메모리에 존재. 네임드 파이프도 일반처럼 동작하지만, FIFO라는 파일을 거쳐 접근. 이것을 통해 프로세스간 통신 가능(IPC)
d : 고급 IPC의 한 종류. 머신끼리의 통신도 가능.프로세스 실행중인 오브젝트 코드. 언제나 활성화 상태로 실행 중인 프로그램이다.
프로세스는 일반적으로 시스템 콜을 이용하여 리소스를 요청하고 조작한다.스레드 각 프로세스는 실행 스레드를 하나 이상 포함한다.
스레드는 프로세스 내부에서 실행하는 활동 단위이며, 코드를 실행하고 프로세스 동작 상태를 유지하는 추상 개념이다.프로세스의 계층 구조 각각의 프로세스는 pid라는 양수값으로 구분 (1~integer의 한계치).
새로운 프로세스는 fork()라는 시스템 콜로 만들어진다.
부모가 자식보다 먼저 kill되면 자식은 init에 소속된다.
자식이 kill될 때 종료상태와 누구인지를 저장하고 부모가 확인할 수 있게 하는데 만약 부모가 없다면 좀비가 된다.사용자와 그룹 리눅스에서 권한을 사용자와 그룹 형태로 제공. uid는 고유한 값.
프로세스마다 자신의 실행 주체를 파악하는 용도. /etc/passwd에 저장.
자식은 부모의 uid를 물려받게 됨.
% 파일 시스템 uid는 파일 시스템 접근을 검증할 때 사용.모든 사용자는 하나 이상의 그룹에 속해있다.
주 그룹이나 로그인 그룹은 /etc/passwd에, 추가 그룹은 /etc/group에 저장된다. 프로세스마다 대응하는 gid가 존재한다.권한 파일마다 접근 권한에 대한 비트가 있따. (9bits).
소유자와 접근 권한 정보는 파일 inode에.시그널 비동기식 단방향 알림 메커니즘.
커널 -> 프로세스. 프로세스 -> 다른 프로세스, 프로세스 -> 자기자신.
SIGKILL과 SIGSTOP을 제외하고는 프로세스 레벨에서 컨트롤 가능하다.
인터럽트와 같다고 생각하면 된다.프로세스간 통신 프로세스 사이에서 일어나는 정보 교환과 알림은 운영체제가 담당하는 가장 중요한 작업.
헤더파일
- 에러 처리
매우 중요. 함수 리턴 값으로 알 수 있으며, 특수한 변수인 errno로 구체적 이유를 확인가능하다.(extern int errno)
C라이브러리는 errno값을 그에 맞는 문자열 표현으로 변환하는 함수들을 제공.(perror).
perror는 문자열 뒤에 콜론을 붙인 다음에 errno가 기술하는 현재에러를 문자열로 바꿔 표준에러로 내보낸다. errno는 전역 변수이고 많은 상황과 멀티스레드에 대응하기 때문에 임시 저장소를 두는 것도 좋다.