fork를 하는데 질문입니다..
1 #include <signal.h> 2 #include <unistd.h> 3 #include <sys/types.h> 4 #include <wait.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 8 /*void alarm_handler() 9 { 10 printf("\n signal handle\n"); 11 return; 12 }*/ 13 14 void main(int argc, char* argv[]) 15 { 16 /*char filename[] 17 char filein[] = &argv[1]; 18 char searchword[] = &argv[2];*/ 19 20 printf(" argc : %d, name : %s, in : %s, word : %s\n", argc, argv[1], argv[2 ], argv[3]); 21 22 int pid[1]; 23 int i, status; 24 25 printf("ppid : %d\n", getpid()); 26 for(i=0; i<2; i++) 27 { 28 pid[i] = fork(); 29 30 if(pid[i] == -1) 31 printf("fail\n"); 32 else if(pid[i] == 0) 33 { 34 //printf("%d %d \n", pid[0], pid[1]); 35 printf("child [%d]: %d\n",i ,getpid()); 36 printf("child [%d] parent : %d\n", i, getppid()); 37 38 exit(1); 39 } 40 else 41 { 42 // printf("wait pid[1] : %d", pid[1]); 43 // sleep(3); 44 if(waitpid(pid[0], &status, WNOHANG) == 0) 45 { 46 } 47 else if(waitpid(pid[1], &status, WNOHANG) == 0) 48 { 49 /*waitpid(pid[0], &status, WNOHANG); 50 printf("wait pid[0] suc\n");*/ 51 // waitpid(pid[1], &status, WNOHANG); 52 printf("wait pid[1] suc\n"); 53 break; 54 } 55 56 // printf("parent : %d\n", getpid()); 57 // exit(1); 58 } 59 } 60 61 // waitpid(pid[1], &status, WNOHANG); 62 // printf("wait pid[1] suc\n"); 63 // 64 printf("braek suc\n"); 65 "signalReport.c" 77L, 1334C 저장 했습니다 31,1-4 31%
일단 제가 처음에 의도한건, 메인에서 fork를 2번 해주는 부분입니다.
제가 의도한 흐름도는 for문에서 한번 자식이 나오고 이 자식은 32번째 줄의 if문에 의해 exit 됩니다.
이때 exit 되면서 부모 프로세스는 44번째 줄에서 대기하다가 wait가 풀리게 됩니다.
그리고 진행을 하여 2번째ㅤ for 문을 들어갑니다.
이번에도 fork문을 거쳐서 자식은 32번째ㅤ if에 의해서 exit가 되고
부모는 진행을 하되 이번에는 44번째 에서 else가 되고 47번째의 if문을 거쳐서 wait를 성공합니다
------
여기까지가 제가 생각한 흐름도인데.. 이게 제대로 안됩니다..
뭐가 문제인지 알고 싶습니다 ㅠㅠ
주석처리한 부분이 좀많은데..이게 처음 짜놓고 계속 안되니까 고치고 해서.. 주석이 많아진듯;;
-----------
최종적으로 할려는 것은.. 부모프로세스는 자식프로세스 두개(자식1. 자식2)를 만들고 자식2가 끝날때까지 대기합니다.
자식1은 파일 이름을 만들고, 자식2로 시그널을 보냅니다.
시그널이 들어오면, 자식2는 시그널핸들러로 등록해서 해당되는 명령을 합니다
-------------
이렇게 하려는데..
일단 제 생각은.. 자식2가 끝날때를 알기 위해서 부모프로세스에서 waitpid(자식2, ~, ~)이렇게 하려고 합니다..
근데 제가 짠 코드에서는 for문을 통해 자식이 순차적으로 생기는 것이기 때문에.. waitpid에 간 부모의 입장에서는 자식2의pid를 모릅니다..
이것을 해결할 방법이 업나요 ㅠㅠ?
아니면 다른 방법으로 부모가 자식2가 끝날떄까지 기다리는 방법을 할고 싶습니다..;
지금 생각나는 것은 sleep으로 강제로 기다리게 하는것 뿐인데.. 코드가 이쁘지 않아서;
고수분들 답변 부탁드립니다.
댓글 달기