c – prctl(PR_SET_PDEATHSIG,SIGNAL)在父线程退出时调用,而不是
我有一个正在分配子进程的进程.如果父进程存在,则子进程不应存在.所以,我在子进程中调用:: 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查找手册页,他们会明确指出它是创建此过程的线程,将信号传递给调用(在您的情况下是子进程)进程:
底线:如果您希望它依赖于父进程的执行,则从主执行线程中分叉.简单来说,不要创建一个线程来分叉子进程,只需从主线程中分叉它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |