gpt4 book ai didi

c - 信号会被传递给在 POSIX 信号量上被阻塞的程序吗?

转载 作者:太空宇宙 更新时间:2023-11-04 01:59:23 25 4
gpt4 key购买 nike

这确实是两个问题,但我认为将它们结合起来会更好。

我们正在开发一个使用异步 TCP 连接的客户端。这个想法是程序将阻塞,直到从服务器接收到特定消息,这将调用 SIGPOLL 处理程序。我们正在使用一个繁忙的等待循环,基本上:

var = 1
while (var) usleep(100);

//...and somewhere else
void sigpoll_handler(int signum){
......
var = 0;
......
}

我们想使用更可靠的东西来代替,比如信号量。问题是,当一个线程被信号量阻塞时,信号还能通过吗?特别是考虑到信号在切换回用户级别时得到传递;如果进程不在运行队列中,它将如何发生?

附带问题(出于好​​奇):

如果没有“usleep(100)”,程序将永远不会通过 while 循环,尽管我可以验证变量是否已在处理程序中设置。这是为什么?打印也会改变它的行为。

干杯!

最佳答案

[评论太长]

从信号处理程序内部访问 var 会调用未定义的行为(至少对于符合 POSIX 的系统而言)。

来自 the related POSIX specification :

[...] if the process is single-threaded and a signal handler is executed [...] the behavior is undefined if the signal handler refers to any object [...] with static storage duration other than by assigning a value to an object declared as volatile sig_atomic_t [...]

所以 var 应该被定义:

volatile sig_atomic_t var;

繁忙的等待 while 循环,可以被一个阻塞的 pause() 的单一调用所取代,因为它会在接收到信号时返回。

来自 the related POSIX specification :

The pause() function shall suspend the calling thread until delivery of a signal whose action is either to execute a signal-catching function or to terminate the process.

顺便说一句,使用 pause() 将使任何全局标志(如 var)的使用变得多余,更不用说不必要了。

关于c - 信号会被传递给在 POSIX 信号量上被阻塞的程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29316017/

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