2017-03-07 2 views
0

이 코드의 동작을 이해하는 문제가 종종불규칙한 결과가

Parent process, fork return value: 343 
Child process, fork return value: 0 

그러나 그것의 나만을 제공 쉘 프롬프트없이이 결과 :

Child process, fork return value: 0 

부모 프로세스에서 wait() 함수로 해결할 수 있습니다. 그러나 나는 알고 싶어 :

결과가 불규칙한 이유는 무엇입니까? 누군가가 무슨 일이 일어 났는지 설명해 주시겠습니까? 자식 프로세스가 좀비가되지만 부모가 printf() 함수 호출을 처리하지 않는 이유는 무엇입니까?

+1

나는 리눅스에이 시도하고 당신이 무엇을 설명 관찰 할 수 없었다 :이 코드

나는 여러 번 자녀 또는 부모의 TEH 출력 라인 프롬프트가 없었 비트했습니다. 대신 나는 항상 두 가지 메시지를 모두 얻는다. 나는 심지어 아버지와/또는 아이에게 잠을 자려고했지만 기대했던 지연 외에도 아무것도 바뀌지 않았습니다. 또한 이론적으로 나는 당신의 관찰에 대한 설명을 찾을 수 없습니다. 이 일이 당신 시스템에서 어떤 일이 일어나는지에 관해 우리에게 말해 주시겠습니까? – Alfe

+0

아버지 프로세스는 메시지도 인쇄해야합니다. 좀비 프로세스는 부모 프로세스가 실행되기 전에 자식 프로세스가 실행을 완료하는 프로세스입니다. printf는'좀비 프로세스 '가되기 전에 실행됩니다. 부모 프로세스는 자식 프로세스에 상관없이 메시지를 출력해야합니다 ... 리다이렉트하지 않은 것과 동일한'stdout'을 포크 공유 한 후에는 프로세스가 분리되어 있습니다. –

답변

1

2 issuse은 재질 - 구글 번역 참고 할 수 있습니다 가끔이 때처럼 뭔가를 얻을 예상치 못한 순서 에서 물건을 실행할 수있는 멀티 태스킹이

fflush(stdout); 

2 세척 할 수 있습니다 표준 출력 버퍼링이)가 1) 그렇게 :

/tmp$ ./a.out 
Parent process, fork return value: 24049 
/tmp$ Child process, fork return value 0 

프롬프트가 자식 프로세스 출력의 시작에 볼 수 있듯이, 당신이 될 것으로 기대 곳에 모두 그냥 아니다 실종 아니에요.

#include <stdio.h> 
#include <stdlib.h> 
int main() { 
int nr; 
nr = fork(); 
    if (nr == 0) { 
    /* Child process */ 
    printf("Child process, fork return value %d\n", nr); 
    fflush(stdout); 
    exit(0); 
    } else { 
    /* Parent process */ 
    printf("Parent process, fork return value: %d\n", nr); 
    fflush(stdout); 
    sleep(1); 
    exit(0); 
    } 
} 
+0

이 응답은 실행 순서가 무엇이든 상관 없으므로 잘못되었습니다. 두 메시지가 모두 'stdout'에 인쇄되어야합니다. 관찰 된 OP는 부모가 인쇄하지 않는 것입니다. –

+0

OP가 아마 관찰하고있는 것은 이슬을 멀티 태스킹으로 인쇄하는 순서에 맞지 않습니다. 오류를 재현 해 냈고 프롬프트가 출력 라인 중 하나에 표시 될 수 있습니다. – louigi600

+0

그가 전체 라인을 잃어버린 경우, fflush가이를 수정할 수있는 좋은 기회가 있습니다. – louigi600