2011-09-01 6 views
5

fork()를 사용하여 새 프로세스를 만드는 프로그램을 만들려고합니다. 샘플 출력은 다음과 같아야합니다.fork() 자식 프로세스와 부모 프로세스

이것은 하위 프로세스입니다. 내 PID는 733이고 부모의 ID는 772입니다.
이것은 상위 프로세스입니다. 내 PID는 772이며, 자녀의 ID이 내가 내 프로그램 코딩하는 방법이다 773

입니다 : 이것은 출력 결과

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), fork()); 

    return 0; 
} 

:

이 자식 프로세스입니다. 내 PID는 22163이고 부모의 ID는 0입니다.
이것은 하위 프로세스입니다. 내 PID는 22162이고 부모의 ID는 22163입니다.

왜 문을 두 번 인쇄하고 자식 ID가 첫 번째 문장에 표시되면 부모의 ID를 제대로 표시 할 수 있습니까?

편집 : 당신이 한 번 프로그램의 실행에 한 번 포크에 두 번의 printf를 호출하기 때문에

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
int pid = fork(); 

if (pid == 0) { 
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), getppid()); 
} 
else { 
    printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), pid); 
} 

return 0; 
} 
+2

프로그램에서 "부모 프로세스"라는 단어를 아무 곳이나 인쇄하려고하지 않습니다. 그것들은 프로그램 텍스트에 나타나지 않습니다. 왜 당신은 그것들이 인쇄되기를 기대합니까? –

+3

'man fork'. 읽어. 단어를 이해하십시오. 직접 자신을 찾을 수있는 방법이 없을 때 StackOverflow로 이동하십시오. 이 경험을하려면 더 나은 프로그래머가 될 것입니다. – asveikau

+2

또한'fork'는 자식에게 부모 프로세스 ID를 반환하지 않습니다. 자식에게 0을 반환하고 부모에게는 자식의 ID를 반환합니다. 그것이 당신이 어떤 것인지를 알 수있는 방법입니다. –

답변

9

fork man pagegetppid/getpid 매뉴얼 페이지를 읽는 것으로 시작하십시오. 포크의 성공

, 자식 프로세스의 PID는 부모의 실행할 스레드에 반환하고, 0에서

는 실행의 자녀의 스레드에서 반환됩니다. 실패하면 부모의 컨텍스트에서 -1이 반환되고 자식 프로세스가 생성되지 않고 errno가 적절히 설정됩니다.

이 자식 프로세스입니다

그래서이 질문에 관해서는

if ((pid=fork())==0){ 
    printf("yada yada %u and yada yada %u",getpid(),getppid()); 
} 
else{ /* avoids error checking*/ 
    printf("Dont yada yada me, im your parent with pid %u ", getpid()); 
} 

의 라인을 아래로 뭔가해야합니다. 내 PID는 22163이고 부모의 ID는 0입니다.

이것은 하위 프로세스입니다. 내 PID는 22162이며, 내 부모의 ID는 22163.

fork()printf 전에 실행됩니다. 그래서 완료되면 동일한 명령어로 두 개의 프로세스를 실행해야합니다. 따라서 printf는 두 번 실행됩니다. fork()에 대한 호출은 자식 프로세스에 0을 반환하고 자식 프로세스의 pid을 부모 프로세스에 반환합니다.

printf ("... My pid is %d and my parent's id is %d",getpid(),0); 

printf ("... My pid is %d and my parent's id is %d",getpid(),22163); 

가 ~

을 마무리하려면, 위의 선이있다 : 두 실행중인 프로세스를 얻을 수

는, 각각이 명령 문을 실행합니다 하위에 해당 pid을 지정합니다. 두 번째 줄은 id (22162)와 그 자식 (22163)을 지정하는 부모 프로세스입니다.

+0

그리고 두 번 인쇄합니다 ... (fork의 사람으로부터) : 새로운 자식 프로세스가 생성 된 후에 두 프로세스는 fork() 시스템 호출 다음에 다음 명령을 실행합니다. 그러므로 우리는 부모와 자녀를 구별해야합니다. 이것은 fork()의 ​​반환 값을 테스트하여 수행 할 수 있습니다. – Icarus

+0

정말 고마워요, 이것은 대단한 고장이었습니다. 위의 수정 된 코드를 편집했습니다. 제대로 작동하는 것 같습니다. 내 논리가 맞는지 두 번 확인해 주시겠습니까? – raphnguyen

+0

@ graphnguyen 모두는 부모 프로세스 ID를 얻기 위해'getppid()'를 호출해야합니다. 샘플에서 상위 프로세스는 하위 프로세스 ID를 대신 인쇄합니다. – Tom

0

이 두 번 인쇄된다. printf 호출에서 fork()를 꺼내보십시오.

2

부모와 자식 모두 인쇄하기 때문에 문을 두 번 인쇄하고 있습니다. 부모는이 같은 0

시도 뭔가의 부모 ID를 가지고

pid_t pid; 
pid = fork(); 
if (pid == 0) 
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(),getppid()); 
else 
    printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), getppid()); 
0

이 올바른 출력을 얻기를위한 올바른 방법입니다 .... 그러나, 부모 ID가 어쩌면 때때로 1로 인쇄 차일을 부모 때문에 프로세스가 종료되고 pid = 1 인 루트 프로세스가이 분리 된 프로세스를 제어합니다.

pid_t pid; 
pid = fork(); 
if (pid == 0) 
    printf("This is the child process. My pid is %d and my parent's id 
     is %d.\n", getpid(), getppid()); 
else 
    printf("This is the parent process. My pid is %d and my parent's 
     id is %d.\n", getpid(), pid); 
관련 문제