Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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
C++ 处理两个结果项_C++_C_Unix_Signals_Sigterm - Fatal编程技术网

C++ 处理两个结果项

C++ 处理两个结果项,c++,c,unix,signals,sigterm,C++,C,Unix,Signals,Sigterm,有一个守护进程有两个线程:th1、th2。th2使用read2读取套接字 如果我用SIGTERM杀死守护进程,th1捕获并处理信号设置终止标志,在调用守护进程析构函数之后,它调用pthread_killth2,SIGTERM。但是,第二个线程不接收SIGTERM,因此当套接字接收数据并从读取中退出时,它不会被终止,因为终止标志已经设置好,它将完成执行 如果我调用pthread_killth2,SIGUSR2,然后调用pthread_killth2,SIGTERM,那么一切都会正确完成。因此,UN

有一个守护进程有两个线程:th1、th2。th2使用read2读取套接字

如果我用SIGTERM杀死守护进程,th1捕获并处理信号设置终止标志,在调用守护进程析构函数之后,它调用pthread_killth2,SIGTERM。但是,第二个线程不接收SIGTERM,因此当套接字接收数据并从读取中退出时,它不会被终止,因为终止标志已经设置好,它将完成执行

如果我调用pthread_killth2,SIGUSR2,然后调用pthread_killth2,SIGTERM,那么一切都会正确完成。因此,UNIX似乎不允许发送相同的信号


这种行为是否取决于操作系统?我们可以确保指定的线程从另一个线程接收SIGTERM吗?

Unix允许向一个进程发送多个连续的信号,尽管如果信号发送得太近,或者在已挂起的信号发送之前向该进程发送了附加信号,然后,可以将多个信号串联成单个信号事件

还要记住,当pthread_kill向要处理的给定线程发送信号时,信号的实际处理具有全局效应,即信号处理程序是每个进程的,而不是每个线程的


您可能还需要研究显式调用pthread_cancel,因为read是一个有效的取消点。如果需要,您可以添加取消处理程序,如果您使用的是不安全的取消函数,还可以阻止线程的取消状态。您可以阅读一些关于使用pthread_cancel的提示。

一个相对古老但有效的方法是使用select和管道将信号重新分派给所有线程。你在你的阻塞句柄上选择一个管道读柄。

如果你在这里包含适当的编程语言标签,C,C++,或者你的语言,你会得到更多的“眼睛”。祝你好运。谢谢,标签上加了一句。我认为unix的意思是C@vissi:那是错误的。您应该只包含您使用的语言的标记。除非您的问题涉及互操作性,否则您应该只标记一种语言。请向我们展示代码。th2是否屏蔽了SIGTERM?th1是否从自己的信号处理程序中调用pthread_kill?是否在重新启动时安装了术语处理程序?为什么USR1不终止这个过程?你是如何处理的?还有,你想杀死th2是什么意思?您是否只想中断阻塞读取?取消正在运行的线程?传递特定的信号?要杀死整个过程?sigaction和SAU SIGINFO与POSIX实时信号排队行为非常正交-说它们启用实时语义是不准确的。此外,认为这些语义可以在运行时启用是错误的。实时信号SIGRTMIN。。SIGRTMAX始终排队,而标准信号则不排队。规范允许他们这么做,但实际上他们不允许。好吧,这就是我困惑的地方。。。我假设在Linux中,如果使用sigaction为标准信号类型设置SA_SIGINFO,那么从规范(而非实现)来看,似乎除了实时信号之外,标准信号也将排队。谢谢你澄清这一点。。。我会更新我的答案。