了解fork()系统调用的工作原理

时间:2014-12-23 19:19:57

标签: c unix process fork pid

我有这个C代码序列:

    printf("\nThe PID of this (main) process is: %d\n", getpid());

    if(fork() != -1) { // #1
        printf("\n\nParent 1 PID: %d\n", getpid());
        for(int i = 0; i < 10; i++) {
            printf("\n%d", i);
        }

        if(fork() != -1) { // #2
            //sleep(1);
            printf("\n\nParent 2 PID: %d\n", getpid());
            for(char i = 'a'; i != 'f'; i++) {
                printf("\n%c", i);
            }
        }
        else { // #3
            sleep(3);
            printf("\n\nChild 2 PID: %d\n", getpid());
            for(char i = 'F'; i != 'J'; i++) {
                printf("\n%c", i);
            }
        }
    }
    else { // #4
        sleep(4);
        printf("\n\nChild 1 PID: %d\n", getpid());
        for(int i = 10; i < 20; i++) {
            printf("\n%d", i);
        }
    }

我希望我有4个程序:两个父母和两个孩子。 在第1行,我第一次调用fork(),第1行到第4行的所有内容都将在第一个父进程中执行。 在父进程(1)中,我再次调用fork(),所以从第2行到第3行我将拥有父2进程,从第3行到第4子进程。

我希望打印的内容:

Parent 1 PID: ....
0
1
2
3
4
5
6
7
8
9
Parent 2 PID: ....
a
b
c
d
e
Child 2 PID: ....
F
G
H
I
Child 1 PID: ....
10
11
12
13
14
15
16
17
18
19

我实际上得到了什么:

Parent 1 PID: 3877

0
1
2
3
4
5
6
7
8


Parent 1 PID: 3878

0
1
2
3
4
5
6
7
8
9

Parent 2 PID: 3877

a
b
c
d
e9

Parent 2 PID: 3878
9


a
b
c
d
Parent 2 PID: 3879

a
b
c
d
e9

eParent 2 PID: 3880

a
b
c
d
e

我做错了什么?

3 个答案:

答案 0 :(得分:3)

这条线没有按你的想法行事:

if(fork() != -1) { // #1

父母和孩子都会成功(只要fork是可能的,这几乎总是如此)。你的意思是在这里测试0。父母将获得0,孩子将获得> 0。 -1是错误。

在您的情况下,您标记为&#34;孩子&#34;除非有错误,否则不应执行双腿。我不认为这就是你的意思。你所看到的是最初的2(父和子)叉子加4(父+子* 2)第二叉子。这就是6​​个叉子,这是输出所表明的。

答案 1 :(得分:2)

来自man fork

RETURN VALUE
       On success, the PID of the child process is returned in the parent, and 0 is returned in the child.  On failure, -1 is returned in the parent, no child process is created, and errno
       is set appropriately.

这意味着,您应该在子进程中期望0和父进程中的子进程pid,因此您的代码应如下所示:

switch(pid = fork()) {
  case -1:  //error handling here
  case 0:   // child process code here
  default:  // parent process code here.
}
圣诞快乐:)

答案 2 :(得分:0)