加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – prctl(PR_SET_PDEATHSIG,SIGNAL)在父线程退出时调用,而不是

发布时间:2020-12-16 07:00:06 所属栏目:百科 来源:网络整理
导读:我有一个正在分配子进程的进程.如果父进程存在,则子进程不应存在.所以,我在子进程中调用:: prctl(PR_SET_PDEATHSIG,SIGKILL)来杀死它,如果父进程死掉的话.最终发生的是父线程调用pthread_exit,并且该线程最终成为杀死子进程的催化剂. 这是我的代码: parent.
我有一个正在分配子进程的进程.如果父进程存在,则子进程不应存在.所以,我在子进程中调用:: prctl(PR_SET_PDEATHSIG,SIGKILL)来杀死它,如果父进程死掉的话.最终发生的是父线程调用pthread_exit,并且该线程最终成为杀死子进程的催化剂.

这是我的代码:

parent.cpp:

#include <sys/prctl.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>
#include <iostream>

void* run(void* ptr) {

    std::cout << "thread:" << getpid() << ":" << std::hex << pthread_self() << ":" << std::dec << getppid() << std::endl;
    auto pid = fork();
    if ( pid != 0 ) {
        sleep(1);
    }
    else {
        char* arg = NULL;
        execv("./child",&arg);
    }
    return NULL;
}

int main() {

    std::cout << "main:" << getpid() << ":" << std::hex << pthread_self() << ":" << std::dec << getppid() << std::endl;

    pthread_t threadid;
    pthread_attr_t attr;

    ::pthread_attr_init( &attr );
    ::pthread_attr_setdetachstate( &attr,PTHREAD_CREATE_DETACHED );
    ::pthread_create(&threadid,&attr,run,NULL);

    sleep(6);

    return 0;
}

child.cpp:

#include <sys/prctl.h>
#include <signal.h>
#include <unistd.h>
#include <iostream>

int main() {
    std::cout << "child:" << getpid() << ":" << std::hex << pthread_self() << ":" << std::dec << getppid() << std::endl;
    ::prctl( PR_SET_PDEATHSIG,SIGKILL );
    sleep(6);


    return 0;
}

在命令行上运行以下命令:

$./parent

同时,运行以下命令查找child的状态:

$for i in {1..10000}; do ps aux | grep child ; sleep .5; done

孩子已经不复存在了.如果你在孩子身上取出prctl电话,它就不会失效.

在http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html的prctl页面似乎描述了这个调用应该在父进程死亡时调用SIGKILL,而不是父线程.当父进程死而不是父线程时,有没有办法让prctl终止子进程?

解决方法

子进程终止,因为它在父线程死亡时收到PR_SET_PDEATHSIG信号.这意味着当创建它的线程死亡时它会获得一个信号.因此,如果您希望子进程依赖于父进程(我假设您的意思是“主”函数死亡时)从父进程执行的主线程中分叉.如果您在 Linux prctl(2) man page查找手册页,他们会明确指出它是创建此过程的线程,将信号传递给调用(在您的情况下是子进程)进程:

Warning: the “parent” in this case is considered to be the
thread that created this process. In other words,the signal
will be sent when that thread terminates (via,for example,
07001),rather than after all of the threads in the
parent process terminate.

底线:如果您希望它依赖于父进程的执行,则从主执行线程中分叉.简单来说,不要创建一个线程来分叉子进程,只需从主线程中分叉它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读