2017-12-16 32 views
0
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main() { 
    if (fork() == fork()){ 

     fprintf(stderr, "Z"); 
    } 
    else { 
     if (waitpid((pid_t)-1,NULL,0)!=-1) { 
      fprintf(stderr, "Y"); 

     } 
     else { 
      fprintf(stderr, "X"); 
     } 
    } 
} 

나는이 프로그램을 연구하면서 "ZYYX"가 출력물이 될 수 있다는 것을 알았습니다. 나는 왜 그런지 이해하지 못한다. 저의 이해에 따르면 부모 -> 부모, 부모 -> 자식, 자식 -> 부모, 자식 -> 부모의 총 4 가지 과정이 있습니다. 그리고 child-> child는 Z를 인쇄하고, child-> parent는 Z를 인쇄 한 후에 Y를 인쇄합니다. 그리고 parent-> parent는 parent-> child가 X를 인쇄 할 때까지 대기해야합니다. 왜 X가 출력의 마지막 문자로 인쇄됩니까?왜 "X"가 출력의 마지막 문자가 될 수 있습니까?

답변

2

나는 waitpid가 자식 프로세스를 기다리는 것을 깨달았습니다. 따라서 ZY가 인쇄되면 Y가 "Y"를 기다렸다가 즉시 인쇄 될 수 있습니다. 따라서 X는 마지막 문자로 인쇄 할 수 있습니다.

+1

그리고 ZYYX는 마지막 위치에 X가있는 독특한 패턴입니다. –

0

나는 축하하기 전에 코드에서 if (fork() == fork())을 사용했다고 생각하지 않는다! 나는 당신의 추적에 전적으로 확신하지 못했습니다. 각 인쇄 프로세스에 포함 된 각 프로세스의 PID를보고 싶습니다. 각 출력의 끝 부분에 줄 바꾸기를 원합니다. 또한 원래 코드에서 대기하지 않는 프로세스가 하나 이상 있습니다.

다음은 각 인쇄 작업을 수행하는 프로세스의 PID를보고하는 재 작성입니다. 일부 프로세스는 0이 아닌 상태로 종료되며, 주로 출력에서 ​​조금 더 흥미로운 상태가됩니다. 이 코드는 발견 된 시체를 추적하고 상태를보고합니다. 또한 죽은 아이들을 청소하기위한 루프를 소개합니다. 원래 프로세스에는 다른 방법으로 정리되지 않은 자식이 있습니다.

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

int main(void) 
{ 
    if (fork() == fork()) 
    { 
     fprintf(stderr, "Z(%d)\n", (int)getpid()); 
     return 23; 
    } 
    else 
    { 
     int corpse; 
     int status; 
     if ((corpse = waitpid((pid_t)-1, &status, 0)) != -1) 
      fprintf(stderr, "Y(%d) - PID %d 0x%.4X\n", (int)getpid(), corpse, status); 
     else 
     { 
      fprintf(stderr, "X(%d)\n", (int)getpid()); 
      return 37; 
     } 
     while ((corpse = waitpid((pid_t)-1, &status, 0)) != -1) 
      fprintf(stderr, "Q(%d) - PID %d 0x%.4X\n", (int)getpid(), corpse, status); 
    } 
    return 0; 
} 

샘플 출력 : 당신이 참고로

X(16551) 
Y(16547) - PID 16551 0x2500 
Z(16552) 
Y(16550) - PID 16552 0x1700 
Q(16547) - PID 16550 0x0000 
0

는, 두 개의 포크를 기반으로 4 개 과정이있을 것이며, 각각 한 문자 인쇄됩니다에

1st fork 2nd fork prints     PP 
parent parent  Y     /\ 
parent child   X     CP PC 
child  parent  Y     \ 
child  child   Z      CC 

그래프를 왼쪽에는 부모/자식 관계가 표시됩니다. /은 첫 번째 포크이고 \은 두 번째 포크입니다.

따라서 CC는 두 포크 모두 0을 반환하고 PC는 X을 인쇄하기 때문에 Z을 인쇄합니다. 다른 두 사람은 모두 어린이가 나올 때까지 기다렸다가 Y을 인쇄합니다. CP의 캐스에는 하나 밖에 자식이 없으므로 Y은 항상 Z 다음에 올 것이지만 PP에는 두 개의 자식이 있으므로 은 ZY 또는 X 뒤에있을 수 있습니다. 어느 쪽이든 가능합니다. 그래서 얻을 수 있습니다

XYZY PC,PP,CC,CP 
XZYY PC,CC,PP,CP or PC,CC,CP,PP 
ZXYY CC,PC,PP,CP or CC,PC,CP,PP 
ZYXY CC,CP,PC,PP 
ZYYX CC,CP,PP,PC