본문 바로가기

systemprogramming5

lseek, pread, pwrite 사용하기 lseek을 이용하면 파일의 offset을 조작하여 이후 offset이 설정된 위치부터 read, write를 할 수 있게 해준다. 즉, 원하는 곳에서부터 읽고 쓸 수 있게 된다는 것이다. lseek 주어진 file descriptor의 file offset을 조작한다. #include off_t lseek(int fd, off_t pos, int whence); lseek 인자 int fd : 조작할 파일과 관련된 file descriptor다. off_t pos : 이동할 file offset의 위치이다. 정확한 위치는 whence의 값에 따라 달라진다. int whence : SEEK_SET, SEEK_END, SEEK_SET 중 하나이다. 반환값 새로 설정된 offset을 반환한다. 실패한 경우 .. 2021. 11. 17.
open, read, write, close 사용하기 리눅스 상에서 사용가능한 파일 입출력 관련 시스템 콜을 소개한다. open, read, write, close는 c를 처음 배울 때 사용하던 파일 관련 함수인 fopen, fread, fwrite와 유사하고, 이들은 사실 이 시스템 콜을 사용한다. open 파일 경로와 flag, mode를 입력으로 넣어주면 file descriptor를 전달하여 준다. fcntl.h 헤더에 포함되어 있다. #include int open (const char *name, int flags) int open (const char *name, int flags, mode_t mode) open 인자 const char* name : 파일의 절대 경로 혹은 상대 경로이거나 파일 이름이다. int flags : 반드시 O_RD.. 2021. 11. 15.
wait, waitpid의 사용 Parent process는 wait, waitpid를 사용하여 자신이 생성한 child process들이 종료되기 전까지 기다려 줄 수 있다. 또, 자식들이 어떻게 종료되었는지와 child process가 종료 할 때의 반환한 값도 알 수 있다. wait wait의 사용법을 먼저 알아보자. wait는 아래와 같은 모습으로 사용할 수 있다. wait(int* status) 인자 status : 종료 상태를 담을 포인터이다. 받을 필요가 없다면 0을 입력한다. 반환 값 pid : 성공시 종료된 child process의 pid 값 -1 : 실패시 -1 wait는 child process가 종료될 때까지 기다렸다가 child process가 종료되면 종료된 child process의 값을 반환한다. 만약 실.. 2021. 10. 19.
fork 사용하기 fork를 사용하여 새로운 프로세스를 만들 수 있다. fork() 시스템 콜에 대해 알아보자. fork fork를 사용하면 현재 프로세스와 거의 같은 프로세스를 하나 더 생성할 수 있다. 생성된 자식 프로세스의 메모리 영역은 parent process의 메모리 영역을 복사한 것이기 때문에 fork() 이전에 parent process에서 존재하던 어떤 변수를 fork() 이후 child process에서 값을 변화시킨다 하더라도 값이 변하지 않는다. 아래는 fork 시스템 콜에 대한 사용법이다. fork() 인자 : 없음 반환 값 0 : fork()가 성공하면 child process에 반환된다. pid 값 > 0 : fork()가 성공하면 parent process에 생성된 child process의 .. 2021. 10. 17.
sigprocmask을 사용하여 signal block 하기 리눅스에서는 프로세스에 Signal을 전달할 수 있다. 그리고 프로세스는 이 Signal에 의한 처리를 막기 위해 원하는 Signal을 Block 할 수 있다. 이를 가능하게 하는 것이 sigprocmask이다. sigset_t 우리는 원하는 Signal을 block 하기 위하여 특정 구조체를 사용하여야 한다. 그 구조체는 sigset_t이다. 사실 sigset_t의 구조는 그리 복잡하지 않다. 정수형 자료형의 배열이라고 생각해도 무관하다. 비트마스크를 사용하기 때문에 사용되는 Signal의 종류 수만큼의 비트 수가 필요하다. kill -l 명령어를 통해 어떤 signal이 몇번인지 볼 수 있다. $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRA.. 2021. 10. 16.