子进程会在 abort() 上发送 SIGCHLD 吗?

发布于 2024-09-25 08:34:29 字数 168 浏览 8 评论 0原文

如果应用程序执行 fork() 并且子进程因 abort() 而死亡(由于 assert() 失败),父进程收到 SIGCHLD

如果相关的话,这是在 Debian 4(gcc 版本 4.1.2)上。

If an application does a fork() and the child dies with an abort() (due to failing an assert()), will the parent process receive a SIGCHLD?

If it's relevant this is on Debian 4 (gcc version 4.1.2).

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

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

发布评论

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

评论(2

回眸一遍 2024-10-02 08:34:30

如果您想检查相同的内容,请编写一个示例代码,该代码分叉一个子进程,并且该子进程调用 abort() (以引发 sigabrt 信号)。在 strace 上检查其输出。(strace 可执行文件)

对于以下代码:

 #include<stdio.h>
 #include<unistd.h>
 int main()
    {
    pid_t pid;
    if(pid=fork()<0)
            {
            fprintf(stderr,"Error in forking");
            }
    else if(pid==0)
            {
            /*The child*/
            abort();
            }
    else {
            waitpid(pid,(int *)0,0);
            }
    return 0;
    }

我得到以下输出:

     --- SIGCHLD (Child exited) @ 0 (0) ---
     gettid()                                = 4226
     tgkill(4226, 4226, SIGABRT)             = 0
     --- SIGABRT (Aborted) @ 0 (0) ---
     +++ killed by SIGABRT +++

所以答案是肯定的,至少在 Ubuntu 发行版上是这样。

If you want to check the same,write a sample code which forks a child and the child calls abort() (To raise the sigabrt signal). Check its output on strace.(strace executable)

For the following code:

 #include<stdio.h>
 #include<unistd.h>
 int main()
    {
    pid_t pid;
    if(pid=fork()<0)
            {
            fprintf(stderr,"Error in forking");
            }
    else if(pid==0)
            {
            /*The child*/
            abort();
            }
    else {
            waitpid(pid,(int *)0,0);
            }
    return 0;
    }

I get this output:

     --- SIGCHLD (Child exited) @ 0 (0) ---
     gettid()                                = 4226
     tgkill(4226, 4226, SIGABRT)             = 0
     --- SIGABRT (Aborted) @ 0 (0) ---
     +++ killed by SIGABRT +++

So the answer is yes, at least on Ubuntu distro.

栖迟 2024-10-02 08:34:30

您希望每当子进程终止时,父进程都会收到 SIGCHLD ,除非子进程已自行脱离来自父级(IIRC 使用setsid() 或setpgrp())。孩子这样做的主要原因是孩子正在启动守护进程。请参阅此处此处可对守护进程进行更深入的处理。

You would expect the parent to get a SIGCHLD any time a child terminates unless the child has separated itself off from the parent (IIRC using setsid() or setpgrp()). The main reason for a child doing this is if the child is starting a daemon process. See Here or Here for a deeper treatment of daemon processes.

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