我有一个分路到一个子进程的过程。 如果父进程中存在的子进程不应该存在的。 因此,我调用::使用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页面http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html似乎来形容,这个调用应该叫SIGKILL当父进程死亡,没有父线程。 有没有什么办法让使用prctl杀死孩子当父进程死亡,而不是父线程?