2014-10-04 45 views
0

我正在创建一个相对简单的多进程程序,以了解使用C的Linux中的信号和信号处理。我有几个进程处理发送到所有进程的信号(我使用sigaction来分配处理程序)过程组和一个跟踪过程,该过程在检测到一定数量的信号之后显示一些信息。信号处理输出显示问题

我的问题是这样的。如何可靠地显示跟踪过程中的控制台输出?此过程需要显示检测到的当前信号数量,并且我知道printf()不适合从信号处理程序调用。我知道我可以使用write(),但是我不确定我可以将变量值放到这里来显示,我认为这个系统调用可以被信号中断。

你能给我一个简单的例子,有3个过程(一个产生信号(父),1个处理信号(孩子1)和一个关于信号的报告信息(孩子2)),或者解释记者如何处理应该使用全局共享变量的值处理输出?

感谢

回答

1

关于什么可以在信号处理程序来完成一些信息,请参阅How to avoid using printf() in a signal handler?

我不能给你一个“简单”的例子,因为你提出的方案非常复杂 - 第三个过程是怎么知道第一个过程发送给第二个过程的信号?信号非常粗糙;除了'发送信号'外,只有很少的信息可用(如果在调用sigaction()函数时使用struct sigactionSA_SIGINFO标志中的sa_sigaction成员,则稍微多一点)。对于大多数实际目的而言,你所要求的是无法完成的。

如果你要接近你的场景,那么也许该方法是在父母中设置一个共享内存段,两个孩子都可以访问它。第二个孩子(信号接收器)可以在收到信号时将信息复制到共享存储器中,而第三个孩子将信息从共享存储器中复制并写入。您需要查看信号处理函数可以使用哪些协调函数(如果有的话) - x-ref'd问题的答案涵盖了这一点(答案看起来像'没有',或者只有粗略的答案如open()mkdir())。奇怪的是,POSIX标准没有列出诸如strcpy()memcpy()之类的功能作为信号安全。关于'如何可靠地显示控制台输出',等待信号到达时你的过程将做什么?您可以安排信号处理程序设置一个标志,并且循环代码可以安排检查标志,格式化和写入数据(甚至包括标准I/O;这不再在信号处理程序中),然后执行回到等待下一个信号到达。

+0

感谢有关printf()的信息。 我知道你对一个流程的看法,知道他人在做什么。我使用mmap()引入了全局共享变量,它引入了并发问题,我可以使用自旋锁,sem,mutext等来处理这些问题......我只需要向所有进程发送信号,并让它们记录接收它,记者进程接收到相同的信号,并在计算了一些信号后显示全局共享数据。 – OwlsCIS 2014-10-05 00:26:38