C 等待信号(POSIX)

C 等待信号(POSIX),c,signals,posix,C,Signals,Posix,我在做一个典型的“等待信号”的情况。我基本上在等待从子进程发送的SIGUSR1,该子进程使用execlp()进行了介绍。即使使用sigaction()捕捉到信号,该过程也不会从sigwaitinfo()开始。 这是代码(因为它不太长,我保留了不太相关的东西,但我基本上是使用管道将数据发送到子进程。我也知道我没有检查返回值,但我检查了,没有错误) 好吧,你必须 sigprocmask( SIG_BLOCK, &waitset, NULL ); 在sigaddset之后,这不会改变

我在做一个典型的“等待信号”的情况。我基本上在等待从子进程发送的
SIGUSR1
,该子进程使用
execlp()
进行了介绍。即使使用
sigaction()
捕捉到信号,该过程也不会从
sigwaitinfo()
开始。 这是代码(因为它不太长,我保留了不太相关的东西,但我基本上是使用管道将数据发送到子进程。我也知道我没有检查返回值,但我检查了,没有错误)

好吧,你必须

    sigprocmask( SIG_BLOCK, &waitset, NULL );

sigaddset

之后,这不会改变结果(是的,我将
&waitset
更改为
&mask
)。我比较了你的代码和我的代码,没有发现任何错误。它适用于我,并给出了验证结果。我刚刚测试了你的代码,它适用于我。也许问题出在别的地方?我从main运行它,没有fork或exec等等,所以基本上它应该可以工作。我刚刚用fprintf和机器人删除了不相关的部分。您是否尝试在等待后设置断点?这确实非常奇怪,在我的情况下是在一个大得多的程序的上下文中,但我不明白为什么它应该重要。。。我也尝试过使用
sigwait()
sigtimedwait()
将允许继续,但仅在超时之后。可能是因为我是C++类的吗?既然程序在这一点上卡住了,为什么断点会有帮助呢?检查一些变量?如果是的话,是哪一个呢?来确认它确实被卡住了,而不仅仅是因为某种原因被抑制了。是的,我知道捕手是否可以打印,你的主代码也应该可以,但检查一下也无妨。我想,如果你检查了定时等待,那么情况可能不是这样。在我的例子中,我使用pselect等待,因为我正在等待套接字,并使用该信号切换日志记录级别。然而,我也在我的主循环中用sigwait尝试了它,它对我和你代码中的SSCE仍然有效。我还使用了一个类,所以这不应该是问题。使用管道而不是信号。创建管道预分叉并让子文件写入其中,或者,如果可用,使用
signalfd
。Hmmmm“我检查过了,没有错误”意味着您没有意识到每次进程执行时会发生不同的情况。就性能而言,创建第二个文件似乎不是一个好主意。上下文是我从一个传感器高速(可能是大量)获取数据,通过管道发送。因为接收子进程可能不够快,所以当它准备好接收更多时,它会向其父进程发送一个信号。我需要一些很轻的东西。。。你知道为什么这样不行吗?创建管道并不意味着创建文件。通过管道写入一个字节比为IPC使用信号要干净得多,而且开销确实很轻。在完成基准测试之前,不要排除这种可能性。您只需要在父级端使用非阻塞写入,让父级丢弃数据或将其转给另一个工作进程(或提高处理速度以跟上进度!)
Got some signal : 10
    sigprocmask( SIG_BLOCK, &waitset, NULL );