1장. waitpid(2)
프로세스의 종료를 기다린다.
1.1절. 사용법
#include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid, int *status, int options); |
1.2절. 설명
waitpid 함수는 인수로 주어진 pid 번호의 자식프로세스가 종료되거나, 시그널 함수를 호출하는 신호가 전달될때까지 waitpid 호출한 영역에서 일시 중지 된다.
만일 pid 로 지정된 자식이 waitpid 함수 호출전에 이미 종료되었다면, 함수는 즉시 리턴하고 자식프로세스는 "좀비프로세스"로 남는다.
pid 값은 다음중 하나가 된다.
- < -1
-
프로세서 그룹 ID가 pid 의 절대값과 같은 자식 프로세스를 기다린다.
- -1
-
임의의 자식프로세스를 기다린다. 이것은 wait(2) 와 동일하다.
- 0
-
프로세스 그룹 ID가 호출 프로세스의 ID와 같은 자식프로세스를 기다린다.
- > 0
-
프로세스 ID가 pid 의 값과 같은 자식 프로세스를 기다린다.
options 의 값은 0이거나 다음값들과의 OR 이다.
- WNOHANG
-
이것은 어떤 자식도 종료되지 않았더라도, 즉시 리턴하란 뜻이다.
- WNOHANG
-
멈추거나 상태가 보고되지 않은 자식들을 위해 리턴
status 는 프로세스의 상태를 가져오기 위해서 사용한다. status 가 NULL 이 아닐경우 status 가 가리키는 위치에 프로세스의 상태정보를 저장한다. 다음의 메크로들을 통해서 상태정보를 알아가져올수 있다.
- WIFEXITED(status)
-
자식이 정상적으로 종료되었다면 non-zero 이다.
- WEXITSTATUS(status)
-
exit()를 호출하기 위한 인자나 return 값이 설정되고 종료된 자식의 반환 코드의 최하위 8비트를 평가한다. 이 매크로는 정상정료 - WIFEXITED(status) - 일때만 평가된다.
- WIFSIGNALED(status)
-
자식프로세스가 어떤 신호때문에 종료되었다면 참을 반환한다.
- WTERMSIG(status)
-
자식프로세스를 종료하도록한 신호의 번호를 반환한다. 당연히 WIFSIGNALED 가 non_zero 일 경우에만 사용할수 있다.
- WIFSTOPPED(status)
-
반환의 원인이 된 자식프로세스가 현재 정지되어 있다면 참을 반환한다.
- WSTOPSIG(status)
-
자식을 정지하도록 야기한 신호의 숫자를 반환한다. WIFSTOPPED가 non-zero 일경우에만 사용할수 있다.
1.4절. 에러
- ECHILD
-
pid 로 지정된 프로세스가 존재하지 않거나, 호출한 프로세스의 자식이 아닐경우
- EINVAL
-
options 인자가 유효하지 않을경우
- ERESTARTSYS
-
WNOHANG 가 설정되어 있지 않고 신호가 봉쇄되지 않았거나 SIGCHLD가 잡혔을때
- ENOBUFS
-
시스템에 연산을 위해서 이용할수 있는 자원이 부족할때
1.5절. 예제
#include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <string.h> int main() { int pid; int status; pid = fork(); if (pid < 0) { perror("fork error : "); exit(0); } if (pid == 0) { printf("Im Child\n"); sleep(10); return 2; } else { printf("Parent: wait (%d)\n", pid); waitpid(pid, &status, 0); if (WIFEXITED(status)) { printf("정상종료\n"); printf("리턴값 %d\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("신호받았음\n"); printf("신호번호 %d\n", WTERMSIG(status)); } } exit(0); } |
'About 배우고 익히는법 > 펌글' 카테고리의 다른 글
PDFsharp and MigraDoc Foundation Homepage. (0) | 2013.12.31 |
---|---|
C#으로 PDF파일 제어하기 (0) | 2013.12.31 |
[TCP/IP] 열혈강의 TCP/IP 예제 소스 (1장~10장) (0) | 2013.12.31 |
[TCP/IP] SIGPIPE (0) | 2013.12.31 |
[TCP/IP] signal(SIG_CHLD, SIG_IGN) (0) | 2013.12.31 |