【问题标题】:Why does SIGINT stop sleep more than one time?为什么 SIGINT 不止一次停止睡眠?
【发布时间】:2019-09-26 10:43:57
【问题描述】:

我不明白为什么在第一次执行 kill 函数后 sleep 函数不会暂停父进程。 发送 SIGINT 后,会生成许多进程。此外,似乎生成了可变数量的进程。 清除待处理信号中的第一个 SIGINT 是否需要 SIGINT 处理程序?

void handler(int s) {
    int status;
    wait(&status);
    printf("\n in the handler");
    if (WIFSIGNALED(status)) {
        int sig=WTERMSIG(status);
        printf("\n child stopped by signal %d\n",sig);
    }
    if (WIFEXITED(status)) {
        int ex=WEXITSTATUS(status);
        printf("\n child stopped with exist status %d\n",ex);
    }
}

int main() {
    int pid,len, count, ret;
    char s[1024];
    signal(SIGCHLD,handler);
    while(1) {
        pid=fork();
        if (pid==0) {
            printf("\n Write something ");
            scanf("%s",s);
            len=strlen(s);
            printf("\n Characters: %d",len);
            return 1;
        }
        else {
            sleep(20);
            kill(pid,SIGINT);
        }
    }
}

【问题讨论】:

标签: c sleep kill


【解决方案1】:

上一个导致儿童死亡的kill 中的SIGCHLD 即将到来,而您正处于下一个sleep 中。

睡眠是一个可中断的功能。如果信号处理程序在您的线程中运行时,sleep 将中止。然后您继续进行下一个kill,这将间接导致另一个SIGCHLD,这很可能在您的下一次迭代睡眠时发生,从而导致几个跳过的睡眠。

如果您在fork() 之前插入sleep(1),它应该(实际上)将时间转移到恰到好处,以便下一个sleep(20); 不会中断。

(我将此视为一个快速而肮脏的实验。在生产代码中依赖这样的“调整”绝不是一个好主意(或者在信号处理程序中使用printf) ).)

【讨论】:

  • 使用{ int t = 20; while (0 <= (t = sleep(t))); } 而不仅仅是sleep(20); 可能也会有所帮助。
  • t 以上应为unsigned int
猜你喜欢
  • 2012-11-30
  • 2015-06-28
  • 2010-12-09
  • 2021-04-12
  • 2021-12-11
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多