2017-02-22 1 views
1

부모로부터 직접 두 프로세스를 생성하는 프로그램을 작성 중입니다. 내 실제 출력은 C 자식 프로세스 생성

Main programs process ID: 2834 
Child 2 (ID: 2836) Start Sequence at: 23 
Child 1 (ID: 2835) Start Sequence at: 20 

처럼 내 예상 출력이 보이는

Main programs process ID: 2834 
Child 2 (ID: 2834) Start Sequence at: 23 
Child 1 (ID: 2835) Start Sequence at: 20 

내 코드는 내가 올바른 자녀 한 과정이 아니라 올바른 자식이 과정을 얻고있다

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

int main(int argc, char *argv[]) 
{ 
    pid_t pid; 
    int n; 

    if (argc == 1) { 
     fprintf(stderr,"Usage: ./a.out <starting value>\n"); 
     return -1; 
    } 
    n = atoi(argv[1]); 

    int p_pid; 
    p_pid = getpid(); 

    printf("Main programs process ID: %d\n", p_pid); 

    pid = fork(); 

    if(pid == 0){ 
     int c1; 
     c1 = getpid(); 
     printf("Child 1 (ID: %d) Start Sequence at: %d\n", c1, n); 
    } 

    if(pid != 0){ 
     int c2; 
     c2 = getpid(); 
     printf("Child 2 (ID: %d) Start Sequence at: %d\n", c2, n+3); 
    } 
    return 0; 
} 

입니다. 무엇이 잘못 되었습니까? 또는이 문제를 어떻게 해결할 수 있습니까?

+0

코드는'fork()'를 한 번 호출하기 때문에 하나의 자식 만 생성됩니다. – user3629249

+0

참고 : 함수 :'fork()'에는 3 가지 종류의 반환 값이 있습니다. 게시 된 코드는 '== 0'리턴 만 확인하고 오류가 발생하지 않았다고 가정합니다. 이는 오류를 확인하지 못하는 매우 나쁜 프로그래밍 습관입니다. – user3629249

+0

주 프로세스 (상위 프로세스)는 모든 하위 프로세스가 종료 될 때까지 리턴해서는 안됩니다. 따라서 부모는 부모가 종료되기 전에 각 자식에 대해'wait()'또는 더 나은'waitpid()'를 호출해야합니다. – user3629249

답변

4

fork()은 2 개의 새로운 프로세스를 생성하지 않습니다. 주 프로세스에서 1 명의 자식을 생성합니다. 자식 프로세스 내부에 0을 반환하고 부모에있는 경우 자식 PID를 반환합니다.

코드에서 자녀가 2 세라고 생각할 때 - 여전히 부모입니다. fork()으로 다시 전화해야하지만 부모 프로세스 내부에서만해야합니다.

+0

게시 된 코드의 다른 문제에 대한 내 의견을 참조하십시오. – user3629249

관련 문제