System Programming 6

(6) Pthread 쓰레드 / PMutex 뮤텍스

Pthread 사용하기 gcc -pthread thread_example.c -o thread_example.o -pthread 플래그로 링크해야한다. 스레드 생성하기 #include int pthread_create(pthread_t* thread, const pthread_attr_t *attr, void* (*start_routine) (void*), void* arg); thread : 생성된 스레드 ID를 반환 attr : 새로 생성할 스레드의 속성을 지정 start_routine : 스레드가 수행할 함수 arg : 수행할 함수에 전달될 인자 스레드 종료 및 취소 void pthread_exit(void* retval); int pthread_cancel(pthread_t thread); 스레드..

(5) 프로세스 관리

프로세스 실행 중인 프로그램을 지칭. 메모리에 적재된 바이너리 이미지, 가상화된 메모리 인스턴스, 열린 파일, 커널 리소스, 사용자 정보, 하나 이상의 스레드를 포함한다. 프로세스 ID 프로세스 ID(pid)는 유일한 식별자로 구분된다. 커널이 실행하는 idle 프로세스의 pid는 0이다. 시스템 부팅이 끝나면 커널이 실행하는 최초의 프로세스 init 프로세스의 pid는 1이다. init 프로세스 init 프로세스는 다음 순서대로 경로에서 찾아 먼저 찾은 프로세스를 실행한다. /sbin/init : 가장 먼저 찾는 init 프로세스 /etc/init : 두번째로 찾는 init 프로세스 /bin/init : 우선 탐색에 실패했을 때 찾는 init 프로세스 /bin/sh : 커널이 앞의 순서댈 init 프로..

(4) 고급 입출력 readv/writev/epoll/mmap

벡터 입출력 한 번의 호출로 배열 형태의 입출력용 자료구조에 데이터를 한 번에 읽고 쓰는 것이 가능하다. 벡터 입출력 readv(), writev() #include ssize_t readv (int fd, const struct iovec *iov, int count); ssize_t writev (int fd, const struct iovec *iov, int count); 파일 디스크립터 fd로 부터 입출력용 자료구조 iovec에 데이터를 읽어드리는 readv() 그리고 iovec의 데이터를 한 번에 쓰는 writev 함수가 있다. 호출이 성공했을 시 읽거나 쓴 바이트 수를 반환한다. 에러가 발생했을 시 -1을 반환. 벡터 입출력용 자료구조 iovec iovec* 은 결국 여러 버퍼의 시작 주소와..

(3) 버퍼 입출력

파일 포인터 FILE* (파일 스트림)로 표준 입출력 하기 파일 열기 fopen() FILE* fopen(const char* path, const char* mode); 모드 mode "r" : 읽기 모드 "w" : 쓰기 모드 "a" : 덧붙이기 모드 "r+", "w+", "a+": 읽기/쓰기 모드 모두 지원 성공 시 유효한 파일 포인터 반환, 실패 시 NULL을 반환. 파일 디스크립터를 통해 스트림 만들기 fdopen() FILE* fdopen (int fd, const char* mode); 반환된 파일 스트림은 파일 디스크립터와 연결된 입출력을 제공한다. 파일 스트림을 닫으면 파일 디스크립터도 닫힌다. 스트림 닫기 fclose() int fclose (FILE* stream); 성공 시 0, 실패..

(2) 다중 입출력 select와 poll

다중화된 입출력 파일 디스크립터에서 발생하는 입출력 이벤트를 확인하는 방법에 대해 알아본다. 동기화된 다중 입출력 메커니즘 select() #include int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); n : 감시하는 파일 디스크립터 중 가장 큰 것에 +1을 한 값 readfds : 읽기를 감시하는 파일 디스크립터 집합 writefds : 쓰기를 감시하는 파일 디스크립터 집합 exceptfds : 예외가 발생하는 지 감시하는 파일 디스크립터 집합 (주로 소켓) timeout : 타임 아웃 시간 성공 시 입출력이 준비된 fd 개수를 반환한다. 타임 아웃시 0을 반환, 에러 시 ..

(1) errno와 파일 입출력

리눅스 운영체제에서 사용되는 시스템 함수는 에러가 발생했을 시 헤더에 정의된 전역 변수에 에러코드가 저장된다. extern int errno; 에러 코드에 대한 에러 메시지를 편하게 출력하기 위한 방법은 다음과 같다. #include void perror (const char* str); // ex if (open("file.txt", O_RDONLY) == -1) { perror("open failed."); } 파일 열기 open() #include #include #include int open (const char* name, int flags); int open (const char* name, int flags, mode_t mode); flags 인자 : O_RDONLY, O_WRONLY, ..