2017-02-22 57 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; 
} 

我得到正确的子1的过程,但不正确的子2的过程。我做错了什么,或者我该如何解决这个问题?

+0

该代码只有一个调用fork(),所以只有一个孩子被创建。 – user3629249

+0

注意:函数fork()有三种返回值。发布的代码仅检查“== 0”返回,然后假定没有发生错误。这是一个非常糟糕的编程实践,无法检查错误。 – user3629249

+0

主要过程(父母)在所有孩子退出之前都不应该返回。因此,在父节点退出前,父节点应该为每个子节点调用wait()或更好的waitpid()。 – user3629249

回答

4

fork()不会创建2个新进程。它从主进程中产生1个孩子。它在子进程中返回0,如果你在父进程中则返回子进程的PID。

所以在你的代码中,当你认为你在孩子2 - 这仍然是父母。您需要再次调用fork(),但只能在父进程中调用。

+0

请查看我对该发布代码的其他问题的意见 – user3629249