我正在创建一个相对简单的多进程程序,以了解Linux中使用C的信号和信号处理。我有几个处理信号的进程(我使用sigaction来分配处理程序),这些进程被发送到进程组中的所有进程,还有一个跟踪进程,在检测到一定数量的信号后显示一些信息。
我的问题是。如何可靠地显示跟踪过程中的控制台输出?这个过程需要显示当前检测到的信号数量,我知道printf()不适合从信号处理程序调用。我知道我可以使用write(),但我不确定我是否可以将变量值放入其中进行显示,我认为这个系统调用可能会被信号中断。
你能给我一个有3个进程的简单例子吗?(一个生成信号(父进程),一个处理信号(子进程1),另一个报告信号信息(子进程2)),或者解释这个报告进程应该如何处理具有全局共享变量值的输出?
感谢
请参阅如何避免在信号处理程序中使用printf()?获取有关信号处理程序中可以执行的操作的一些信息。
我不能为你的3个流程请求举一个"简单"的例子,因为你概述的场景非常复杂——第三个流程究竟如何知道第一个流程发送给第二个流程的信号?信号非常粗糙;除了"发送了信号"之外,几乎没有其他可用信息(如果在调用sigaction()
函数时使用struct sigaction
和SA_SIGINFO
标志的sa_sigaction
成员,则信息会略多)。出于大多数实际目的,你所要求的是做不到的。
如果你要接近你的场景,那么方法可能是在父母中设置一个共享内存段,两个孩子都可以访问。第二个孩子(信号接收器)可以在收到信号时将信息复制到共享内存中,而第三个孩子则从共享内存中复制信息并写入。您需要查看信号处理程序函数可以使用哪些协调函数(如果有的话)——x-ref问题的答案涵盖了这一点(答案看起来像"none",或者只有像open()
或mkdir()
这样的粗糙函数)。奇怪的是,POSIX标准没有将strcpy()
或memcpy()
等功能列为信号安全。
至于"如何可靠地显示控制台输出",在等待信号到达时,您的流程将做什么?您可以安排信号处理程序设置标志,循环代码可以安排检查标志、格式化和写入数据(甚至使用标准I/O;这已经不在信号处理程序中了),然后再返回等待下一个信号到达。