gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:55 33 4
gpt4 key购买 nike

我有一个正在 fork 到子进程的进程。如果父进程存在,则子进程不应存在。

因此,我在子进程中调用 ::prctl(PR_SET_PDEATHSIG, SIGKILL) 以在父进程死亡时将其杀死。

最终发生的事情是父线程调用 pthread_exit,该线程最终成为杀死子进程的催化剂。

这是我的代码:

父类.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;
}

子.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

child 死了。如果您删除子进程中的 prctl 调用,它不会失效。

prctl man page似乎描述了这个调用应该在父进程死掉时调用SIGKILL,而不是父线程。

有没有办法让 prctl 在父进程而不是父线程死亡时杀死子进程?

最佳答案

子进程死亡是因为它在父线程死亡时收到PR_SET_PDEATHSIG信号。这意味着当创建它的线程死亡时它会收到一个信号。因此,如果您希望子进程依赖于父进程(我假设您的意思是当“主”函数死亡时)从父进程的执行主线程中 fork 。如果您在 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, pthread_exit(3)), rather than after all of the threads in the parent process terminate.

底线:如果您希望它依赖于父进程的执行,请从执行的主线程中 fork 。简单来说,不要创建线程来 fork 子进程,只需从主线程中 fork 即可。

关于c++ - prctl(PR_SET_PDEATHSIG, SIGNAL) 在父线程退出时调用,而不是在父进程退出时调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10761197/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com