C 另一个带有sigtimedwait的信号
此代码是在100秒内处理SIGINT信号,如果SIGINT未到达,则为打印超时C 另一个带有sigtimedwait的信号,c,linux,signal-handling,C,Linux,Signal Handling,此代码是在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>
#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 ("Timeout\n");
return -1;
}
if(v== SIGINT){
printf("SIGINT\n");
return 1;
}
return 0;
}
(代码1)当代码在sigtimedwait中时,如果另一个信号不是SIGINT将到达,代码是否将继续
如果SIGKILL
,SIGTERM
,SIGUSR1
,SIGUSR2
。。。。任何带有终止进程的默认操作的其他信号都将到达,进程将被终止。如果信号SIGCHLD
或SIGURG
到达,它们将被忽略-代码将“继续”在sigtimedwait
中(因为这些信号没有要执行的处理程序)。如果出现停止信号(SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU),进程将停止。当SIGSTOP
之后,我们恢复该过程(通过发送SIGCONT
),则sigtimedwait
将返回-1
,errno
将设置为EINTR
。有关详细信息,请参阅和
(代码2)当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 ("Timeout\n");
return -1;
}
if(v== SIGINT){
printf("SIGINT\n");
return 1;
}
return 0;
}
否。将执行信号处理程序,然后sigtimedwait
将返回-1
,errno
将设置为EINTR
(TBH为什么不直接测试代码?写一些看起来很简单(1
在信号处理程序、编译器中,运行进程并向其发送SIGUSR1信号,看看会发生什么)
也许这取决于建筑
它不是——行为不取决于体系结构,而是取决于操作系统的行为——取决于负责向进程转发和处理信号并对其进行管理的底层软件。与POSIX兼容的操作系统必须执行POSIX指定的操作,独立于其运行的体系结构
(代码1)当代码在sigtimedwait中时,如果另一个信号不是SIGINT将到达,代码是否将继续
如果SIGKILL
,SIGTERM
,SIGUSR1
,SIGUSR2
…任何具有终止进程默认操作的其他信号将到达,进程将终止。如果信号SIGCHLD
或SIGURG
到达,它们将被忽略-代码将“继续”进入sigtimedwait
(因为这些信号没有要执行的处理程序)。如果有停止信号(SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU),进程将停止。当SIGSTOP
之后,我们恢复进程(通过发送SIGCONT
),则sigtimedwait
将返回-1
,errno
将设置为EINTR
。有关更多信息,请参阅和
(代码2)当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 ("Timeout\n");
return -1;
}
if(v== SIGINT){
printf("SIGINT\n");
return 1;
}
return 0;
}
否。将执行信号处理程序,然后sigtimedwait
将返回-1
,errno
将设置为EINTR
(TBH为什么不直接测试代码?写一些看起来很简单(1
在信号处理程序、编译器中,运行进程并向其发送SIGUSR1信号,看看会发生什么)
也许这取决于建筑
不是——行为不取决于体系结构,而是取决于操作系统的行为——取决于负责将信号转发和处理到进程并对其进行管理的底层软件。符合POSIX的操作系统必须执行POSIX指定的操作,独立于其运行的体系结构。使用和要了解使用
gcc-Wall-Wextra-g编译的程序的行为,请阅读和的文档。另请参阅,也请阅读,为什么不测试代码?@KamilCuk可能这取决于架构。我询问sigtimedwait
的概念,sigtimedwait的在线手册回答了您的问题(man 2 sigtimedwait)。特别是,如果您阅读错误部分,您将得到:EINTR等待被信号处理程序中断;请参阅信号(7)。(此处理程序用于集合中的信号以外的信号。)使用并理解使用gcc-Wall-Wextra-g编译的程序的行为。因此,请阅读和的文档。另请参阅,并阅读,为什么不测试代码?@KamilCuk可能这取决于架构。我询问sigtimedwait
的概念,sigtimedwait的在线手册回答了您的问题ns(man 2 sigtimedwait)。特别是,如果您阅读错误部分,您将得到:EINTR等待被信号处理程序中断;请参阅信号(7)。(此处理程序用于集合中的信号以外的信号。)