C 另一个带有sigtimedwait的信号

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>

此代码是在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 ("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)。(此处理程序用于集合中的信号以外的信号。)