此代码用于在100秒内处理SIGINT信号,或者在SIGINT未到达时打印超时。
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main (int argc, char *argv[])
{
sigset_t mask;
sigset_t orig_mask;
struct timespec timeout;
sigemptyset (&mask);
sigaddset (&mask, SIGINT);
if (sigprocmask(SIG_BLOCK, &mask, &orig_mask) < 0) {
perror ("sigprocmask");
return 1;
}
timeout.tv_sec = 100;
timeout.tv_nsec = 0;
int v =sigtimedwait(&mask, NULL, &timeout);
if (errno == EAGAIN) {
printf ("Timeoutn");
return -1;
}
if(v== SIGINT){
printf("SIGINTn");
return 1;
}
return 0;
}
当代码在sigtimedwait
中时,如果SIGINT以外的另一个信号将到达,代码会继续吗?或者sigtimedwait
只有在信号情报到达时才会结束?
此外,如果在这个代码之前,我会注册到另一个信号,如signal(SIGUSR1, handle_sig);
,当sigtimedwait
和SIGUSR1
中的代码到达时,handle_sig
会被调用吗?否则它会被阻塞?
int main (int argc, char *argv[])
{
signal(SIGUSR1, handle_sig);//
sigset_t mask;
sigset_t orig_mask;
struct timespec timeout;
sigemptyset (&mask);
sigaddset (&mask, SIGINT);
if (sigprocmask(SIG_BLOCK, &mask, &orig_mask) < 0) {
perror ("sigprocmask");
return 1;
}
timeout.tv_sec = 100;
timeout.tv_nsec = 0;
int v =sigtimedwait(&mask, NULL, &timeout);
if (errno == EAGAIN) {
printf ("Timeoutn");
return -1;
}
if(v== SIGINT){
printf("SIGINTn");
return 1;
}
return 0;
}
(代码1(当代码处于sigtimedwait时,如果SIGINT之外的另一个信号将到达,代码是否会继续?
如果SIGKILL
、SIGTERM
、SIGUSR1
、SIGUSR2
。。。。任何其他具有终止进程的默认操作的信号都将到达,进程将被终止。如果信号SIGCHLD
或SIGURG
到达,它们将被忽略——代码将"0";继续";在sigtimedwait
中为(因为没有针对这些信号执行的处理程序(。如果出现停止信号(SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU(,进程将停止。当在SIGSTOP
之后我们恢复该过程时(通过发送SIGCONT
(,则sigtimedwait
将返回-1
,并且errno
将被设置为EINTR
。有关更多信息,请参阅man 7 signal
和posix sigtimedwait以及posix信号概念。
(代码2(当sigtimedwait和SIGUSR1中的代码到达时,会调用handle_sig吗?
是。
否则它将被阻止?
否。信号处理程序将被执行,然后sigtimedwait
将返回-1
,errno
将被设置为EINTR
。
(TBH为什么不测试代码?在信号处理程序、编译器和运行进程中放入一些write(1
,并向其发送SIGUSR1信号,看看会发生什么,这看起来很琐碎(
也许这取决于体系结构
它不是——行为不取决于体系结构,而是取决于操作系统的行为——取决于负责将信号转发和处理到进程并对其进行管理的底层软件。一个符合POSIX的操作系统必须做POSIX指定的事情,独立于它运行的体系结构