【问题标题】:I am not receiving correctly my signals with SIGUSR1 and SIGUSR2我没有正确接收 SIGUSR1 和 SIGUSR2 的信号
【发布时间】:2021-11-06 19:32:58
【问题描述】:

我在使用 SIGUSR1SIGUSR2 信号时遇到了问题。实际上我有一个客户端程序发送一个二进制字符串*str(例如:1100111代表g字母)到服务器程序,通过使用SIGUSR1信号'1'和SIGUSR2'2' .服务器像这样接收它们:

signal(SIGUSR1, my_handler);
signal(SIGUSR2, my_handler);
pause();

my_handler 对应的位置:

void my_handler(int signum) {
if (signum == SIGUSR1)
    printf("1");
else
    printf("0"); }

但问题是例如“g”字符的输出是01,所以看来接收不正确。我应该怎么做才能从我的服务器打印1100111? 提前非常感谢你:)

【问题讨论】:

  • 欢迎来到 StackOverflow!请拨打tour 并阅读“How to Ask”以了解本网站的运作方式。然后回来edit您的问题,提供您的客户端和服务器的minimal reproducible examples。 -- 您是否知道处理程序在处理时被重置为默认值,至少在许多系统中? -- signal() 已弃用,请参阅其文档以获取更多信息。 -- printf() 在信号处理程序中被调用是不安全的。
  • 信号没有排队,因此如果您的程序在处理第一个 sigusr1 之前获得另一个 sigusr1,您将丢失数据...
  • @Shawn 那么还有其他选择吗?
  • @antiyro 在同一台计算机上的客户端和服务器之间进行通信? Unix套接字常用

标签: c server signals pid


【解决方案1】:

信号没有排队

通常情况下,标准信号不是,但实时信号是,所以这些是替代方案。但是为您的目的使用两个(或更多)信号还有另外两个问题:

  1. 一个信号可以中断另一个信号的处理;这可以通过在信号处理期间阻止两个(或更多)来解决。
  2. 即使实时信号被排队(这实现了接收的信号与发送的信号一样多),但这并不能实现不同的信号按照它们发送的顺序传递给处理程序;这个问题仍然存在。

所以,要摆脱第二个问题,我们必须只使用一个信号。 (这也使第一个问题消失了,因为一个信号在处理过程中被自动阻止。)当然这意味着我们需要另一种方法来传递您要发送的信息。幸运的是,sigqueue() 会随信号一起发送 value。为了在信号处理程序中访问这个值,我们必须使用sigaction() 而不是signal() 来安装它。这样,您的服务器程序的相关部分就变成了

void my_handler(int signum, siginfo_t *info, void *uc)
{
    write(1, &(char){'0'+info->si_value.sival_int}, 1);
}

…
    struct sigaction act = { .sa_sigaction = my_handler,
                             .sa_flags     = SA_SIGINFO };
    sigemptyset(&act.sa_mask);
    sigaction(SIGRTMIN, &act, NULL);
    for (; ; ) pause();

客户端程序发送带有序列的示例模式

    sigqueue(pid, SIGRTMIN, (union sigval){1});
    sigqueue(pid, SIGRTMIN, (union sigval){1});
    sigqueue(pid, SIGRTMIN, (union sigval){0});
    sigqueue(pid, SIGRTMIN, (union sigval){0});
    sigqueue(pid, SIGRTMIN, (union sigval){1});
    sigqueue(pid, SIGRTMIN, (union sigval){1});
    sigqueue(pid, SIGRTMIN, (union sigval){1});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2013-07-16
    • 2021-09-10
    • 2021-12-01
    相关资源
    最近更新 更多