2005. 3. 15. 15:58
1장. wait(2)
프로세스 정료를 기다린다.
1.2절. 설명
주로 fork() 를 이용해서 자식 프로세스를 생성했을때 사용한다. wait() 를 쓰면 자식프로세스가 종료할때까지 해당영역에서 부모프로스쓰가 sleep 모드로 기다리게 된다. 이는 자식프로세스와 부모프로세스의 동기화를 위한목적으로 부모프로세스가 자식프로세스보다 먼저 종료되어서 자식프로세스가 고아 프로세스(PPID 가 1)인 프로세스가 되는걸 방지하기 위한 목적이다.
만약 자식 프로세스가 종료되었다면 함수는 즉시 리턴되며, 자식이 사용한 모든 시스템자원을 해제한다.
그런데 어떤이유로 부모가 wait()를 호출하기 전에 자식 프로세스가 종료버리는 경우도 있다(잘못된 메모리 연산등으로 인한 죽음, 혹은 정상적으로), 이럴경우 자식프로세스는 좀비프로세스가 되는데, wait()함수는 즉시 리턴하도록 되어있다.
wait()의 인자 status 를 통하여 자식 프로세스의 상태를 받아올수 있는데, 자식프로세스의 상태값은 자식프로세스의 종료값 * 256(FF) 이다.
1.4절. 에러
다양한 원인에 의해서 에러가 발생할수 있으며 아래와 같은 에러 메시지들이 있다.
- ECHILD
pid 로 지정된 프로세스가 존재하지 않거나, 해당 pid 가 자신의 자식 프로세스가 아닐경우
- ENOTSOCK
s 가 소켓이 아닌 파일일경우
- ENOTCONN
소켓이 연결되어 있지 않을경우
- 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) { int i; for (i = 0; i < 5; i++) { printf("Child : %d\n", i); sleep(2); } exit(3); } else { // 부모프로세스는 자식프로세스가 // 종료할때까지 기다린다. printf("I wait Child(%d)\n", pid); wait(&status); printf("Child is exit (%d)\n", status); } } |
[root@localhost c_source]# ./wait I wait Child(12128) Child : 0 Child : 1 Child : 2 Child : 3 Child : 4 Child is exit (768) |
'UNIX' 카테고리의 다른 글
file 검색 in 유닉스,리룩스 (0) | 2005.07.20 |
---|---|
UNIX 셀 프로그램에서 값 비교하기.. (0) | 2005.04.07 |
main() 함수의 매개변수-> (argc,argv) (0) | 2005.03.15 |
int argc, char **argv 의 정체가 정말 (0) | 2005.03.15 |
Unix System Programming 5 (1) | 2005.03.15 |