我有一个分叉给子进程的进程。如果父进程存在,则子进程不应该存在。
所以,如果父进程死了,我会调用::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 手册页似乎描述了这个调用应该SIGKILL
在父进程死亡时调用,而不是父线程。
当父进程而不是父线程死亡时,有什么方法可以让 prctl 杀死子进程?