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.
在我正在编写的代码中,检查信号处理程序的 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.