Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
linux:sigwait()优先于pthread\u sigmask(SIG\u UNBLOCK)?_Linux_Multithreading_Signals - Fatal编程技术网

linux:sigwait()优先于pthread\u sigmask(SIG\u UNBLOCK)?

linux:sigwait()优先于pthread\u sigmask(SIG\u UNBLOCK)?,linux,multithreading,signals,Linux,Multithreading,Signals,在程序中,SIGCHLD被主线程阻止,然后 线程“thread_1”正在执行sigwait() 线程“thread_2”,它分叉子进程并杀死它,在这个线程中,我调用pthread_sigmask(SIG_UNBLOCK,&set,0)在杀死子进程之前解除SIGCHLD的阻塞 但SIGCHLD仍由sigwait()接收 除了在创建线程之前从main()取消阻止SIGCHLD之外,还有什么方法可以使SIGCHLD绕过sigwait()?我不希望sigwait()处理SIGCHILD 谢谢,这种行为是

在程序中,SIGCHLD被主线程阻止,然后

  • 线程“thread_1”正在执行sigwait()
  • 线程“thread_2”,它分叉子进程并杀死它,在这个线程中,我调用pthread_sigmask(SIG_UNBLOCK,&set,0)在杀死子进程之前解除SIGCHLD的阻塞 但SIGCHLD仍由sigwait()接收

    除了在创建线程之前从main()取消阻止SIGCHLD之外,还有什么方法可以使SIGCHLD绕过sigwait()?我不希望sigwait()处理SIGCHILD


    谢谢,

    这种行为是允许的:

    为进程生成的信号应正好传递给进程中的一个线程,该线程正在调用sigwait()函数,选择信号[哪个线程]未阻止信号的传递

    (重点加上。)


    只需从等待线程的选择掩码中删除SIGCHLD,程序就会执行您想要的操作。

    Ahh,谢谢。很遗憾,我无法更改执行sigwait()的线程的代码。您可以更改分叉线程吗?您可以设置一个管道或socketpair,派生一个运行您想要运行的程序的小包装程序,然后让该包装器将其子线程的退出代码写回您的线程。这假定sigwaiting线程将无害地丢弃不期望的SIGCHLD。否则,您将需要更为奢侈的解决方案。@wei如果您无法控制线程,则需要将其隔离到自己的进程中。一个进程中的所有线程都必须在处理进程级资源(如内存、信号和文件描述符)时进行协作。一个不合作的线程是不能容忍的,应该被隔离。@pilcrow谢谢,我会试试的。我可以想到的另一个解决方法是插入sigwait(),从sigset中删除sigchld,然后调用下游(glibc)sigwait(),我建议您不要插入自己的sigwait()-这可能会让您望而却步@戴维施瓦茨说得对,你现在的处境很不好。