분류 전체보기

유닉스

양방향 파이프

파이프 두 개 생성하면 됨 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 ..

유닉스

시그널 처리

프로세스 종료 전, 처리할 작업이 남았거나 특정 시그널에 대해 종료하고 싶지 않으면 시그널 수행할 함수 지정하면 됨 시그널 붙잡기 : 시그널 확인해 처리하는 일 시그널 핸들러 함수 시그널 핸들러 : 시그널 받았을 때 이를 처리하기 위해 지정된 함수 signal #include void (*signal(int sig, void (*disp)(int)))(int); void handler(int signo){ printf("signal handler signal number : %d\n",signo); } int main(){ void (*hand)(int); //시그널 함수 리턴값인 함수 포인터 저장할 변수 선언 hand = signal(SIGINT, handler); printf("wait 1st ctr..

유닉스

시그널 보내기

프로그램에서 시그널 보내려면 kill, raise, abort 함수 사용하면 됨 $kill -9 3255 PID가 3255인 프로세스를 강제로 종료하는 명령 인자로 지정한 프로세스에 시그널 보내는 명령 kill #include #incldue int kill(pid_t pid, int sig); int main(){ kill(getppid(), SIGCONT); //부모에게 ISGCONT, SIGCONT : 무시, 특별한 처리 x kill(getpid(), SIGQUIT); //코어 덤프 발생시키며 종료, 자신에게 SIGQUIT //이 뒤에거는 실행이 안됨 } pid : 시그널 받을 프로세스의 ID 0보다 큰 수 : pid로 지정한 프로세스에 시그널 보냄 0 : 특별한 프로세스(스케쥴러)를 제외 [PGI..

hahihi
'분류 전체보기' 카테고리의 글 목록 (20 Page)