我有一个进程,正在派生一个子进程。如果父进程不存在,则子进程不应存在。
因此,我在子进程中调用
但实际情况是,父线程调用
以下是我的代码: parent.cpp:
同时,运行以下命令以查找子进程的状态:
因此,我在子进程中调用
::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
同时,运行以下命令以查找子进程的状态:
$ for i in {1..10000}; do ps aux | grep child ; sleep .5; done
子进程失效了。如果在子进程中删除prctl调用,它就不会失效。
prctl手册页似乎描述了这个调用应该在父进程死亡时调用SIGKILL
,而不是父线程。
是否有办法让prctl在父进程死亡时杀死子进程而不是父线程?