【问题标题】:Signal Handling Output Display Issue信号处理输出显示问题
【发布时间】:2014-10-04 18:20:16
【问题描述】:

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

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

您能否给我一个简单的示例,其中包含 3 个进程(一个生成信号(父级)、一个处理信号(子级 1)和一个报告信号信息(子级 2)),或者解释一下这个报告进程应该如何处理用全局共享变量的值处理输出?

谢谢

【问题讨论】:

    标签: c linux signal-handling


    【解决方案1】:

    请参阅How to avoid using printf() in a signal handler? 了解有关可以在信号处理程序中执行的操作的一些信息。

    我不能为您的 3 进程请求提供一个“简单”示例,因为您概述的场景非常复杂 - 第三个进程到底如何知道第一个进程发送给第二个进程的信号是什么?信号非常粗糙;除了“已发送信号”之外,几乎没有可用的信息(如果在调用sigaction() 函数时使用struct sigactionSA_SIGINFO 标志的sa_sigaction 成员,则信息会稍微多一点)。对于大多数实际目的,您所要求的无法完成。

    如果您要接近您的场景,那么方法可能是在父级中设置一个共享内存段,两个子级都可以访问。第二个孩子(信号接收者)可以在收到信号时将信息复制到共享内存中,而第三个孩子将信息从共享内存中复制出来并写入。您需要查看信号处理函数可以使用哪些协调函数(如果有) - x-ref'd 问题的答案涵盖了这一点(答案看起来像“无”,或者只是粗略的比如open()mkdir())。奇怪的是,POSIX 标准并未将 strcpy()memcpy() 等函数列为信号安全函数。

    关于“如何可靠地显示控制台输出”,您的进程在等待信号到达时会做什么?您可以安排信号处理程序设置一个标志,循环代码可以安排检查标志、格式化和写入数据(甚至使用标准 I/O;这不再在信号处理程序中),然后再去回到等待下一个信号的到来。

    【讨论】:

    • 感谢有关 printf() 的信息。我知道你在说一个进程知道另一个进程在做什么。我确实有使用 mmap() 的全局共享变量,它引入了并发问题,我可以使用自旋锁、sem、mutext 等来处理这些问题......我只需要向所有进程发送信号并让它们记录接收它的同时报告进程接收到相同的信号并在统计多个信号后显示全局共享数据。
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多