关于linux c进程调用的问题

Cosven 发布于 2014/06/15 20:51
阅读 284
收藏 0

我在学习linux c的进程调用,遇到下面这个问题.

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

int main()
{
    pid_t pid1, pid2, pid, ppid;
    char *message;

    pid1 = fork();
    pid2 = fork(); // create three process
    ppid = getppid();
    pid = getpid();
    switch(pid1)
    {
        case -1:
            perror("first fork failed");
            exit(1);
        case 0: // child 1 : p1
            switch(pid2)
            {
                case -1:
                    perror("second fork failed");
                    exit(1);
                case 0: // child 1'child : p3
                    printf("child 3, pid:%d, ppid:%d \n", pid, ppid);
                    break;
                default: // child 1
                    printf("child 1, pid:%d, ppid:%d \n", pid, ppid);
                    break;
            }
            break;
        default:
            switch(pid2)
            {
                case -1:
                    perror("second fork failed");
                    exit(1);
                case 0: // child 2
                    printf("child 2, pid:%d, ppid:%d \n", pid, ppid);
                    break;
                default: // parent
                    printf("parent , pid:%d, ppid:%d \n", pid, ppid);
                    break;
            }
            break;
    }
    return 0;
}



运行结果会出现这样子:(我查了pid为2195的进程是 init --user)

也有可能是这样子:

但我觉得应该每次都类似这样子

以下是问题补充:

@Cosven:还请哪位好心人帮忙解答,谢谢 (2014/06/15 21:02)
加载中
0
Cosven
Cosven

找到问题了,是因为父进程没有等待子进程结束.

子进程打印ppid的时候,有可能父进程已经结束,所以打印的ppid是init --user的pid.

0
思维特无敌
思维特无敌
从你的预期看,你需要得到子进程号。而你的代码是要求子进程显示父进程号,而不是要求子进程返回子进程号
Cosven
Cosven
我是想 查看子进程的ppid,也就是父进程id,.但是我觉得子进程的ppid应该是parent的id,结果应该类似与第三幅图,child1 和child2的父进程id都是parent.但是前面两幅图片所显示的结果,打印出来的ppid却不是parent的id.而是2159(也就是init --user这个进程的id),所以我有点疑惑.
0
DayByDay
DayByDay
父进程早于fork出来的子进程结束,所以子进程将其ppid设置为init进程的pid
Cosven
Cosven
恩恩, 后面发现了这个问题.谢谢
返回顶部
顶部