유닉스

유닉스

레코드 록킹 (advisory locking)

multipel reader, single writer일 경우 사용 록 정보는 fork 호출에 의해 계승되지 않음 fcntl 호출의 파일 포인터를 변경시키지 않음 한 프로세스에 속한 모든 록은 그 프로세스 죽을 때 자동 제거됨 읽기 록 : 쓰기만 제한 다른 프로세스들이 쓰기 록 적용 못하게 함, 여러 프로세스들이 같은 구역에 동시 읽기 록 가능 쓰기 록 : 읽기, 쓰기 다 제한하고 혼자 쓰기만 가능 다른 프로세스들이 그 구역에 읽거나 쓰기 록 할 수 없도록 함 파일의 한 구역에는 한 순간에 하나의 쓰기 록만이 존재 가능 #include int fcntl(int fildes, int cmd, struct flock *ldata); int main(){ struct flock my_lock; my_lock...

유닉스

이름 있는 파이프

부모 - 자식 간이 아닌 독립적인 프로세스들은 서로의 존재 모름 -> 이름 있는 파이프 사용해야 함 특수 파일의 한 종류, FIFO라고 함 FIFO로 사용할 특수 파일을 먼저 생성해야 함 (명령이나 함수로) 명령으로 FIFO 파일 생성 - mknod, mkfifo mknod 명령 FIFO 파일 뿐 아니라 특수 파일도 생성하는 명령 mknod 파일명 p $mknod HAN_FIFO p $ls -F // FIFO file 목록 HAN_FIFO| //|이 FIFO 표시임 mkfifo 명령 FIFO 파일만 생성하는 명령 /usr/bin/mkfifo [-m mode] path 또는 mkfifo [-m mode] path $mkfifo -m 0644 BIT_FIFO 함수로 FIFO 파일 생성 - mknod, mkf..

유닉스

양방향 파이프

파이프 두 개 생성하면 됨 int main(void) { int fd1[2], fd2[2]; pid_t pid; char buf[257]; int len, status; pipe(fd1); pipe(fd2); switch (pid = fork()) { case -1 : perror("fork"); exit(1); break; case 0 : /* child */ close(fd1[1]); close(fd2[0]); //fd1로는 읽고 fd2로는 쓰기 write(1, "Child Process:", 15); //표준 출력 len = read(fd1[0], buf, 256); //읽기 write(1, buf, len); //파이프로부터 읽은 것 표준 출력 strcpy(buf, "Good\n"); write(..

유닉스

파이프 - select

부모 프로세스가 서버 프로세스로 동작, 자신과 통신하는 클라이언트 (자식 프로세스) 를 임의의 수만큼 가지는 경우 사용 #include int select(int nfds, fd_set *readsfs, fd_set *writefs, fd_set *errorfs, struct timeval *timeout); int main(){ //서버 1, 클라이언트 2인 상황 int fd1, fd2; fd_set readset; fd1 = open("file1", O_RDONLY); fd2 = open(file2", O_RDONLY); FD_ZERO(&readset); FD_SET(fd1, &readset); FD_SET(fd2, &readset); switch(select(5,&readset,NULL,NULL,N..

유닉스

파이프

두 프로세스 간에 통신 할 수 있도록 인터페이스 제공 일반적으로 이름 없는 파이프 (익명 파이프) - 부모자식 간 통신 기본적으로 단방향 grep pipe test.c | more 명령도 파이프 이용한 명령 앞 부분의 표준 출력이 뒤 명령의 표준 입력으로 들어감 간단한 파이프 - popen, pclose (생성, 닫기) 쉘을 실행해야 해서 비효율적, 주고받을 수 있는 데이터도 제한적임 #incldue FILE *popen(const char *command, const char *mode); int pclose(FILE *stream); //쓰기 전용 int main(){ FILE *fp; //pipe의 file pointer int a; fp = popen("wc -l", "w"); //자식 proce..

유닉스

기타 시그널 처리 함수

유닉스는 시그널 정보 출력 / 올 때까지 기다리기 / 시그널 보내기 등 시그널 처리와 관련된 기타 함수 제공함 시그널 정보 출력 psignal, strsignal #include #incldue void psignal(int sig, const char *s); char *strsignal(int sig); sig : 정보 출력할 시그널 s: 출력할 문자열 psignal : s에 지정한 문자열 출력 후 sig로 지정한 시그널 가리키는 이름 붙여 표준 오류로 출력 strsignal : 인자로 받은 시그널 가리키는 이름을 문자열로 리턴, 받은 시그널 없으면 NULL 리턴 시그널 블록킹과 해제 프로세스가 동작하는 동안 특정 시그널들을 받지 않도록 블록 / 해제 가능 sighold, sigrelse - 시그널 ..

유닉스

알람 시그널

일정 시간 지난 후 자동으로 시그널 발생하게 하는 시그널 alarm - 알람 시그널 생성 #include unsigned int alarm(unsigned int sec); void handler(int signo){ psignal(signo, "received signal"); } int main(){ sigset(SIGALRM, handler); alarm(2); printf("wait\n"); sleep(3); //sleep(1)이면 1초 뒤에 바로 꺼짐 //alarm은 2초 후에 발생하는 시그널인데 alarm 발생 전에 종료돼서 } sec : 알람 발생시킬 때까지 남은 시간 (초 단위) 인자로 지정한 시간 지나면 SIGALRM 시그널 생성되어 프로세스에 전달됨 프로세스별로 알람시계는 하나 (알람은..

유닉스

sigaction

시그널 받았을 때 처리할 수 있는 함수 지정 가능하게 함 signal, sigset은 시그널 핸들러만 지정 가능, sigaction은 다양하게 시그널 제어 가능함 sigaction 구조체 에 정의되어 있음 시그널 처리 위한 시그널 핸들러 주소, 핸들러 수행하는 동안 블록될 시그널, 추가적인 기능 설정 가능한 플래그로 구성됨 struct sigaction{ int sa_flags; union { void (*sa_hadnler)(); void (*sa_sigaction)(int, siginfo_t *, void *); } _funcptr; sigset_t sa_mask; } sa_falgs : 시그널 전달 방법 수정할 플래그 지정 논리 OR 연산으로 연결해서 지정함 안쓰면 0으로 두기 SA_ONSTACK ..

hahihi
'유닉스' 카테고리의 글 목록