【问题标题】:Sending payload with sigaction使用 sigaction 发送有效负载
【发布时间】:2016-10-23 18:52:01
【问题描述】:

如何使用 sigaction 以便进程可以发送带有信号的有效负载,该信号可以由接收进程检索?

【问题讨论】:

    标签: c linux operating-system


    【解决方案1】:

    您使用实时信号(SIGRTMIN+0SIGRTMAX-0),以便信号排队,并且您丢失信号的可能性要小得多。 (标准信号没有排队,所以如果两个信号几乎同时发送,实际上只有一个被发送。)

    使用sigaction() 安装处理程序时,您使用SA_SIGINFO 标志,因此处理程序的签名是

    void signal_handler(int signum, siginfo_t *info, void *context)
    

    当使用sigqueue() 发送信号时,第三个参数是指针或int,存储在union sigval 类型的联合中。 (对于union sigval value,int 为value.sival_int,指针为value.sival_ptr。在Linux 中,您可以使用value.sival_ptr = (void *)(unsigned long)yourval; 发送完整的longunsigned long。)

    (在 Linux 中,sizeof (long) == sizeof (void *),因此您实际上可以发送 CHAR_BIT*sizeof (long) 位信息;这是 32 位架构中的 32 位和 64 位架构中的 64 位。)

    处理程序可以通过检查info->si_code == SI_QUEUE 来确定是否使用sigqueue() 发送了信号。然后有效载荷可用 在info->si_value 联合。请注意,您无法知道发送者发送的是指针还是 int,您需要事先知道。 sigaction() 手册页描述了所有字段,包括 si_code

    不要对->si_int->si_ptr->si_value 感到困惑。定义siginfo_t 结构,以便成员si_intsi_value.sival_int 引用完全相同的int,并且si_ptrsi_value.sival_ptr 引用完全相同的ptr。为了向后兼容,这些字段还有一些额外的“名称”,仅此而已。

    请记住,在高负载时,即使是实时信号也可能会丢失。但是,我们通常使用HUPTERM 之类的信号来告诉服务守护进程重新加载其配置或退出;因此,对于类似的管理目的,以及对于信息(而不是关键)消息,使用信号及其有效负载是可以的。

    【讨论】:

      【解决方案2】:

      信号不用于在进程之间传递过多的数据。考虑另一种 IPC 机制,如管道、套接字等。

      或者,您也可以结合使用它们。例如。在进程之间共享管道的两端,然后在进程A中向它写入一些东西,然后向进程B发送信号。将信号传递给进程B被视为准备从管道读取,然后进程B只是从a读取数据管道,由 A 编写。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-17
        • 1970-01-01
        • 1970-01-01
        • 2020-03-28
        相关资源
        最近更新 更多