【问题标题】:Interrupted system call in CC中中断的系统调用
【发布时间】:2016-01-30 20:21:04
【问题描述】:

即使出现信号,我也想让我的程序最多休眠 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 秒 任何信号。

【问题讨论】:

  • 你想处理这些信号还是忽略它们?
  • 如果您阅读the signal(7) manual page,您会看到SIGUSR1(和SIGUSR2)的默认操作是终止进程。
  • 请阅读信号介绍。您似乎无法理解信号的工作原理。

标签: c linux unix signals system-calls


【解决方案1】:

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

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

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

            sleep(30);
    }

【讨论】:

  • 请记住,忽略信号会导致系统调用停止被信号中断。如果您想对信号“不做任何事情”但仍会被中断,请改为注册一个空的信号处理程序。
  • 我认为到时候它会处理信号。到时候也会中断。
  • 是的,但是当你忽略一个信号时,它不会被处理并且你的进程永远不会被中断。
【解决方案2】:

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

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

// register signal
    signal(SIGNAL_ID, my_function);  

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 2015-01-09
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2015-07-14
    • 2011-08-06
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多