C 语言:如何评估信号处理程序的 return 值?

C Language: how do I evaluate the return value of a signal handler?

在我正在编写的代码中,检查信号处理程序的 return 值以确保接收到信号非常有用。所以,例如,如果我有这样的东西:

Message m;
sig_t s = signal(SIGALRM, sigalrm);
alarm(DURATION);
int status = msgrcv(msg_id, &m, sizeof(m.appointment), destination_mailbox, 0);

将要发生的事情是程序将在到达 msgrcv 命令时立即阻塞,因为它将等待消息。但是,如果它在 DURATION 秒后没有收到消息,警报信号将唤醒它,状态将等于 -1。

现在,理想情况下,假设我想确保程序是由于警报而不是其他原因唤醒的。比方说msgrcv出错,程序就醒了,但是status还是-1,m还是空的。

return 信号状态值的 man 条目

signal() returns the previous value of the signal handler, or SIG_ERR on error. In the event of an error, errno is set to indicate the cause.

如果我在调用信号处理程序后尝试打印 sig_t 的值,我该怎么做?这会打印“信号(无)”。

 printf("signal %p\n", s);

那么,如果我想要

这样的东西,我该如何处理这个 return 值
if(s == a state where the handler was never called)
      do A;
else
      do B;

如果msgrcv is interrupted by a signal, it should return -1 and errno should be set to EINTR (unless the behavior has been changed using sigaction).

所以要检查那个案例:

int status = msgrcv(/*...*/);
if (status == -1) {
    if (errno == EINTR)) {
        /* interrupted by signal */
    }
    else {
        /* other error */
    }
}

如果您需要专门检查 SIGALRM 中断,您可以让您的信号处理程序设置一个全局 sig_atomic_t 变量,然后在 msgrcv returns.