叉不向母亲显示孩子pid

时间:2019-01-03 17:28:52

标签: c unix fork

我刚开始使用Fork,并了解了它的实际工作原理,通常是在母亲方面,当我打印变量a时,我应该获得子进程ID,但它给我零

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

void main(){

    int a;
    a=fork();
    if(a==0){
        printf("Child Process, pid= %d, mother id: %d", getpid(), getppid());
        exit(0);
    }else{
        wait(&a);
        printf("Mother Process, Child pid= %d, mother's pid= %d ", a, getpid());    

    }

}

1 个答案:

答案 0 :(得分:7)

您使用的wait错误。定义如下:

pid_t wait(int *stat_loc)

所以当你打电话的时候

wait(&a);

您将忽略返回值,该返回值将是子代的PID,而将fork返回的子代PID替换为子代返回的退出状态。

如果将printf语句放在等待之前,则会看到a中已经有孩子的PID。正确调用wait然后重复输出应该会得到相同的结果……尽管在下面的示例中,我也包括了状态结果。

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

void main(){

    int a;
    a=fork();
    if(a==0){
        printf("Child Process, pid= %d, mother id: %d\n", getpid(), getppid());
        exit(0);
    }else{
        int status;
        printf("Mother Process, Child pid= %d, mother's pid= %d\n", a, getpid());    
        a=wait(&status);
        printf("Mother Process, Child pid= %d, mother's pid= %d, status = %d\n", a, getpid(), status);    

    }

}