고아 프로세스문제좀 도와주세요.
글쓴이: seuwl / 작성시간: 토, 2005/12/03 - 12:16오후
프로그램을 하나 작성중입니다. 메인 프로그램에서 judge와 2개의 player프로세스 총 3개의 프로세스를 생성하고 기다리는 프로그램입니다. 그런대 자꾸 player를 고아 프로세서로 만들어 두고 메인 프로그램이 죽어버리는군요...; wait위치가 잘못 된건지 ...어떤 부분이 잘 못됬는지 잘 모르겠습니다. 조언좀 부탁드립니다.
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <sys/types.h> 6 #include <sys/stat.h> 7 8 9 int main( int argc, char* argv[]) 10 { 11 int pid; 12 13 unlink("pipe"); 14 mknod("pipe", S_IFIFO, 0); 15 chmod("pipe", 0660); 16 printf("가위, 바위, 보 : 3가지중 반복\n"); 17 pid = fork(); 18 if( pid > 0 )//부모 프로세스인경우 19 { 20 pid = fork(); 21 if( pid > 0 )// 부모 프로세스인경우 22 { 23 pid = fork(); 24 if( pid == 0 ) //자식 프로스세인 경우 선수 프로세스로 변경 25 { 26 execlp("./player","player", argv[2],NULL); //선수 프로그램 호출 27 28 } 29 } 30 else //자식 프로세스인경우 선수 프로세스로 변경 31 { 32 execlp("./player", "player", argv[3],NULL);//선수프로그램 호출 33 } 34 } 35 else //자식 프로세스인 경우 심판 프로세스로 변경 36 { 37 execlp("./judge","judge", argv[1],NULL); //심판 프로그램 호출 38 } 39 wait(); 40 return 0; 41 }
Forums:
고아라는 것은 좀비 프로세스 말씀하시는 거죠?제가 코드를 보기에는
고아라는 것은 좀비 프로세스 말씀하시는 거죠?
제가 코드를 보기에는
wait 이 한개 밖에 없어서 그런것 같습니다.
wait을 자식 프로세스 갯수 만큼 사용하셔야 할듯 합니다.
아니면 waitpid 를 사용하셔도 될듯...
일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.
고아 프로세스는 부모 프로세스가 자식 프로세스를 기다리지 않고 죽은 상태
고아 프로세스는 부모 프로세스가 자식 프로세스를 기다리지 않고 죽은 상태를 말합니다^^ 그럴 경우 자식 프로세스의 PPID는 1 init프로세스로 바뀌게 되죠. 그런대 소스 코드에서 보면 메인 프로세스 하나에 자식이 3개 달려있는 형태라서 wait를 한번만 호출해도 상관없지 않나요?ㅠ.ㅠ 혹시해서 wait를 3개 연속 달아봐도 똑같네요^^;;난감...;
wait()은 '종료한 자식 프로세스 중 [b]하나[/b]'를 구제하는
wait()은 '종료한 자식 프로세스 중 하나'를 구제하는 것이기에 쌀밥님 말씀 대로 wait()을 세 번 호출해 주셔야 하는 것이 맞습니다.
문제의 원인은... wait()의 반환값을 확인해 보면 아실 수 있습니다. wait()은 정수에 대한 포인터를 인자로 받으며 성공한 경우 죽은 자식의 pid를 반환합니다. 실패한 경우는 -1을 반환하고 errno에 적절한 오류 코드를 기록합니다.
----
한 발짝 더 나아가면, 컴파일 할 때 -Wall 옵션을 사용해 주시고, 거기서 나오는 warning을 모두 잡아주시면 이런 문제가 발생하는 걸 상당히 줄일 수 있습니다.
$PWD `date`
답변해주신 분들 모두 감사합니다. 문제의 뭔인은 wait를 3번 걸어줘야
답변해주신 분들 모두 감사합니다. 문제의 뭔인은 wait를 3번 걸어줘야 하는대 자식 프로세스의 루틴이 돌아가기도 전에 wait를 걸어줘서 멈춰버리는 현상이였네요^^ 그리고 컴파일 시에 -Wall은 몰랐던 사실인대 감사합니다. -Wall로 컴파일 하니까 버그잡기가 좀더 수월해졌네요^^
답변해주신 분들 모두 감사합니다. 문제의 뭔인은 wait를 3번 걸어줘야
답변해주신 분들 모두 감사합니다. 문제의 뭔인은 wait를 3번 걸어줘야 하는대 자식 프로세스의 루틴이 돌아가기도 전에 wait를 걸어줘서 멈춰버리는 현상이였네요^^ 그리고 컴파일 시에 -Wall은 몰랐던 사실인대 감사합니다. -Wall로 컴파일 하니까 버그잡기가 좀더 수월해졌네요^^
감사하다는 글을 두번 써주는 정도의 센스!! 8)
감사하다는 글을 두번 써주는 정도의 센스!! 8)
日新 日日新 又日新
Google Talk::chanju_dot_jeon(at)gmail_dot_com
댓글 달기