C中中断的系统调用

mrg*_*mrg 7 c unix linux signals system-calls

即使发生信号,我也想让我的程序休眠 10 秒。所以,我尝试了以下程序。

程序:

#include<stdio.h>
#include<signal.h>
#include<errno.h>
int main()
{
    printf("PID: %d\n",getpid());
    int unslept=10;
    while(unslept>0){
        unslept=sleep(unslept);
        if(errno==EINTR)
            continue;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ ./a.out 
PID: 18935
User defined signal 1
$
Run Code Online (Sandbox Code Playgroud)

我预计即使信号中断,上述程序也会执行 10 秒。我在一个终端中执行了这个程序。并使用另一个终端使用 kill 命令向该进程发送 SIGUSR1 信号。但是,同样的问题发生了。一旦信号通过,程序终止。那么,有没有办法在不影响任何信号的情况下执行我的程序长达 10 秒。

Nis*_*mar 1

您可以使用信号处理机制。注册将处理中断信号的方法,并在函数中忽略它。

// signal handler
    void my_function(int sig){
      //do nothing
    }

// register signal
    signal(SIGNAL_ID, my_function);  
Run Code Online (Sandbox Code Playgroud)