C语言中的中断系统调用

7
我希望我的程序能够在发生信号时休眠最多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;
}

输出:

$ ./a.out 
PID: 18935
User defined signal 1
$

我希望上述程序即使被中断信号打断,也能执行10秒钟。我进行了实验,一个终端执行该程序。然后使用另一个终端使用kill命令向该进程发送SIGUSR1信号。但是,同样的问题发生了。一旦信号传递,程序就会终止。那么,有没有办法在不影响任何信号的情况下执行我的程序达到10秒。


你想处理这些信号还是忽略它们? - Valery Shevchuk
4
如果你阅读信号(signal(7))手册页面,你会发现SIGUSR1(和SIGUSR2)的默认操作是终止进程。 - Some programmer dude
请阅读有关信号的介绍。看起来您不太理解信号的工作原理。 - fuz
2个回答

2

您可以忽略信号。看下面的例子,在该示例中,如果SIGUSR1信号被中断,它只是使用SIG_IGN忽略了该信号。

#include<stdio.h>
#include<signal.h>

    int main(void)
    {
            if (signal(SIGUSR1, SIG_IGN) == SIG_ERR)
                    perror("SIGUSR1");

            sleep(30);
    }

2
请记住,忽略信号会导致系统调用不再被信号中断。如果您想在收到信号时“什么也不做”,但仍然希望被中断,请注册一个空的信号处理程序。 - fuz
我认为那时它会处理信号,同时也会被中断。 - user5076313
是的,但当您忽略一个信号时,它不会被处理,您的进程也不会被中断。 - fuz

1
你可以使用信号处理机制。注册一个方法来处理中断信号,然后在你的函数中忽略它。
// signal handler
    void my_function(int sig){
      //do nothing
    }

// register signal
    signal(SIGNAL_ID, my_function);  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接