首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在孩子完成之前杀死父进程?

如何在孩子完成之前杀死父进程?
EN

Stack Overflow用户
提问于 2013-12-19 16:05:41
回答 3查看 741关注 0票数 1

我需要父进程比子进程更早地结束。这是代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
main()
{
    extern int errno;
    extern char* sys_errlist[];
    pid_t pid;
    int rv;
    switch(pid=fork()) {
        case -1:
            perror("fork");
            exit(1);
        case 0:
            printf(" CHILD: This is child-process!\n");
            printf(" CHILD: My PID -- %d\n", getpid());
            printf(" CHILD: My parent PID -- %d\n", getppid());
            sleep(3);
            printf(" CHILD: My new parent PID -- %d\n", getppid());//I think, that getppid() return 1 
            printf(" CHILD: Exit!\n");
            exit(rv);
        default:
            printf("PARENT: This is parent-process!\n");
            printf("PARENT: My PID -- %d\n", getpid());
            printf("PARENT: My child PID %d\n",pid);
            printf("PARENT: Exit!\n");
    }
}

但我不确定这是否正确。此程序的输出:

代码语言:javascript
复制
PARENT: This is parent-process!
PARENT: My PID -- 943
PARENT: My PID -- 943
PARENT: My child PID -- 944
PARENT: Exit!
CHILD: This is child-process!
CHILD: My PID -- 944
CHILD: My parent PID -- 1
CHILD: My new parent PID -- 1
CHILD: Exit!

谢谢!PS。我很抱歉我的英语

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-19 17:07:14

看起来,您的父进程甚至在孩子开始睡觉之前就退出了。这是可能的,因为您的父母在创建孩子之后不会做任何花费大量时间的事情。它只是打印和退出。所以孩子在睡觉前就看到了PPID 1。

如果在父程序的末尾添加一个sleep(1),那么子程序打印两个不同的PPID的可能性要大得多。

如果这样做不起作用,那么您必须执行一些实际的同步操作,才能让您的进程按照正确的顺序运行这些步骤。睡眠对此并不好,因为您无法控制其他东西所花费的时间(包括您的进程根本没有运行的时间,因为其他东西占用了CPU)。

票数 1
EN

Stack Overflow用户

发布于 2013-12-19 16:50:52

输出看上去很好。父进程似乎正在退出;子进程不受父进程死亡的影响,并继续打印其输出。

您可以看到,当父进程退出时,其父进程的父级发生了变化;孤儿由进程ID 1继承,进程ID 1只是坐在那里等待孩子死亡。PID 1在传统上是init进程(例如,在Mac上,它是/sbin/launchd)。

票数 1
EN

Stack Overflow用户

发布于 2013-12-19 17:15:13

也许你似乎缺少的是两个进程之间的某种形式的同步,例如通过信号、管道等。你来选择

为确保执行顺序:

  • fork()之后的父级打印它的内容,告诉孩子醒来后立即退出
  • 孩子在醒来前等着,然后在轮到他的时候打印自己的东西。

sleep(),而不是,它是一个同步原语(但对于简单的东西来说却很方便)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20686307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档