c-另一个带有sigtimedwait的信号



此代码用于在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);,当sigtimedwaitSIGUSR1中的代码到达时,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之外的另一个信号将到达,代码是否会继续?

如果SIGKILLSIGTERMSIGUSR1SIGUSR2。。。。任何其他具有终止进程的默认操作的信号都将到达,进程将被终止。如果信号SIGCHLDSIGURG到达,它们将被忽略——代码将"0";继续";在sigtimedwait中为(因为没有针对这些信号执行的处理程序(。如果出现停止信号(SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU(,进程将停止。当在SIGSTOP之后我们恢复该过程时(通过发送SIGCONT(,则sigtimedwait将返回-1,并且errno将被设置为EINTR。有关更多信息,请参阅man 7 signal和posix sigtimedwait以及posix信号概念。

(代码2(当sigtimedwait和SIGUSR1中的代码到达时,会调用handle_sig吗?

是。

否则它将被阻止?

否。信号处理程序将被执行,然后sigtimedwait将返回-1errno将被设置为EINTR

(TBH为什么不测试代码?在信号处理程序、编译器和运行进程中放入一些write(1,并向其发送SIGUSR1信号,看看会发生什么,这看起来很琐碎(

也许这取决于体系结构

它不是——行为不取决于体系结构,而是取决于操作系统的行为——取决于负责将信号转发和处理到进程并对其进行管理的底层软件。一个符合POSIX的操作系统必须做POSIX指定的事情,独立于它运行的体系结构

相关内容

  • 没有找到相关文章

最新更新