Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pthread#u cancel不终止子级正在使用popen运行的命令(带有g+;+;)的Linux) 我有一个C++程序,它创建一个线程,线程运行一个命令,它使用POPON永久挂起。p>_Linux_G++_Pthreads_System_Popen - Fatal编程技术网

pthread#u cancel不终止子级正在使用popen运行的命令(带有g+;+;)的Linux) 我有一个C++程序,它创建一个线程,线程运行一个命令,它使用POPON永久挂起。p>

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",

当父线程调用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","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);//执行挂起的我的命令}