gpt4 book ai didi

c++ - 处理两个后续的 SIGTERM

转载 作者:太空狗 更新时间:2023-10-29 20:30:31 26 4
gpt4 key购买 nike

有一个守护进程有两个线程:th1,th2。 th2 使用 read(2) 读取套接字。

如果我用 SIGTERM 终止守护进程,th1 会捕获并处理信号(设置终止标志),在调用守护进程析构函数之后,它会调用 pthread_kill(th2, SIGTERM) 。然而,第二个线程没有收到SIGTERM,所以它没有被杀死(当套接字收到数据并从read()中退出时,它完成执行,因为已设置终止标志)。

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

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

最佳答案

Unix 确实允许向一个进程发送多个连续的信号,但是如果信号发送的距离太近,或者在传递一个已经挂起的信号之前向进程发送了一个额外的信号,那么多个信号可以连接成一个单一信号事件。

还请记住,虽然 pthread_kill() 将信号发送到要处理的给定线程,但信号的实际处理具有全局效果(即,信号处理程序是每个进程的,不是每个线程)。

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

关于c++ - 处理两个后续的 SIGTERM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6928656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com