关于linux c进程调用的问题

发布于 2021-11-23 02:46:13 字数 1908 浏览 922 评论 5

我在学习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)

也有可能是这样子:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

尐偏执 2021-11-29 09:35:06

恩恩, 后面发现了这个问题.谢谢

倾城泪 2021-11-29 00:38:15

父进程早于fork出来的子进程结束,所以子进程将其ppid设置为init进程的pid

画骨成沙 2021-11-29 00:12:17

我是想 查看子进程的ppid,也就是父进程id,.但是我觉得子进程的ppid应该是parent的id,结果应该类似与第三幅图,child1 和child2的父进程id都是parent.但是前面两幅图片所显示的结果,打印出来的ppid却不是parent的id.而是2159(也就是init --user这个进程的id),所以我有点疑惑.

月亮是我掰弯的 2021-11-28 19:54:50

从你的预期看,你需要得到子进程号。而你的代码是要求子进程显示父进程号,而不是要求子进程返回子进程号

画骨成沙 2021-11-24 09:37:05

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文