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