2017-09-26 5 views
0

프로세스 트리를 만들려고하는데, 지금 내 결과물은 다음과 같습니다. https://gyazo.com/a71f4e095b69080a6d6a11edd2c0df27 문제는 제가 오른쪽에 그린 다이어그램처럼 보이게하고 싶습니다.하지만 할 수 있습니다. 어떻게 생각하는지 모르겠다. 나는 각각의 자식 프로세스 부모 ID를 출력하고 나서 2, 1 (SIGKILL 시그널을 5 초 후에 보낸다)로 시작하여 삭제할 것이다. 프로세스 트리를 원하는 결과처럼 보이게하려면 어떻게해야합니까? 내 코드는 다음과 같습니다.C 프로세스 트리 생성에 대한 도움말

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 


int main() 
{ 
    int root, t1, t2, i; 

    root = getpid(); 
    printf("root %d\n", root); 
    for (i = 1; i < 3; i++) 
    { 
     t1 = fork(); 
     //printf("%d\n", t1); 
     if(t1!=0) 
     { 
     t2 = fork(); 
     } 
     if (t1 !=0 && t2 != 0) 
     { 
      break; 
     } 

     printf("child pid %d parent pid %d\n", getpid(), getppid()); 
    } 
    sleep(10); 

    return 0; 
} 

고마워요!

답변

0

기본 for 루프는 다이어그램과 일치하지 않는 모든 포크에서 실행됩니다. 당신이 실제로 원하는 것은 당신의 경우 문이 나무와 같은 구조를 가지고있다 :

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 


int main() 
{ 
    printf("root %d\n", getpid()); 

    if (fork()) 
    { 
     fork(); 
    } else { 
     if (fork()) 
     { 
      if (fork()) 
      { 
       fork(); 
      } 
     } 
    } 

    printf("child pid %d parent pid %d\n", getpid(), getppid()); 

    fflush(stdout); 

    sleep(10); 

    return 0; 
} 

이 원하는 결과를 제공합니다

root 5140 
child pid 5140 parent pid 377 
child pid 5147 parent pid 5141 
child pid 5149 parent pid 5141 
child pid 5146 parent pid 5140 
child pid 5148 parent pid 5141 
child pid 5141 parent pid 5140 

NB합니다. sleep()은 자식들 앞에서 프로세스가 종료되지 않도록 보장합니다.이 시점에서 그들의 자식들은 ppid = 1 (init)이되도록 부모가됩니다.

+0

그리고 맨 아래에서 삭제하려면 (2의 하위 프로세스를 모두 삭제 한 다음 1을 삭제하십시오) 어떻게 처리합니까? 나는 SIGKILL을 사용할 것인가? 나는 SIGKILL을 두 번 실행하려고 시도했으나 한 번만 "죽임"을 인쇄 한 다음 프로그램을 종료하고 원하는 내용을 확인하는 방법을 모르겠습니다. –