pthread#u cancel不终止子级正在使用popen运行的命令(带有g+;+;)的Linux) 我有一个C++程序,它创建一个线程,线程运行一个命令,它使用POPON永久挂起。p>
当父线程调用pthread_cancel时,线程被取消,但线程运行的挂起命令不退出,它被init接管pthread#u cancel不终止子级正在使用popen运行的命令(带有g+;+;)的Linux) 我有一个C++程序,它创建一个线程,线程运行一个命令,它使用POPON永久挂起。p>,linux,g++,pthreads,system,popen,Linux,G++,Pthreads,System,Popen,当父线程调用pthread_cancel时,线程被取消,但线程运行的挂起命令不退出,它被init接管 //Main.cpp void * runCmdFn (void *) { pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); FILE *fp; fp = popen("/root/hangup",
//Main.cpp
void * runCmdFn (void *) {
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
FILE *fp;
fp = popen("/root/hangup","r");
pclose(fp);
return NULL;
}
int main() {
pthread_t th;
pthread_create(&th,NULL,runCmdFn,NULL);
sleep(30);
pthread_cancel(th);
return 0;
}
正在运行的程序的pstree输出:
pthread(39263)─┬─hangup(39265)
└─{pthread}(39264)
父级退出后,挂起由init接管:
├─hangup(39265)
有没有一种方法可以产生一个线程来执行系统调用(一段时间后挂起),父线程可以杀死或取消所有这些调用?Quick note-异步取消用于纯计算绑定的循环,它不调用任何系统调用,因此也不包含取消点。启用时,除了标记为async cancel safe的系统调用之外,不允许调用任何系统调用,其中只有三个系统调用:
pthread\u cancel()
,pthread\u setcancelstate()
,和pthread\u setcanceltype()
。请参阅第2.9.5节关于线程取消的内容:我将实现更改为使用fork,这很有帮助。我分叉一个进程而不是线程。并且子进程将prctl参数设置为在父进程死亡时kill:if(pid==0){::prctl(PR_SET_PDEATHSIG,SIGKILL);//执行挂起的我的命令}