在 C 中,linux,关于 kill signal 和循环中的 sleep()

In C, linux, about kill signal and sleep() in loop

我 运行 我的 C 程序在 Mac OS 上。我的程序的一部分如下。此代码 运行 在 sigint 信号上运行良好,但无法在 sigkill 信号上运行。

void sigkill(int sig){
    /*some code neglected*/
    exit(0);
}
void sigint(int sig){
    flag=1;
}

void alive(void) {
    signal(SIGINT, sigint);
    signal(SIGKILL, sigkill);
    alarm(10);
    while(1){
        //printf("%d\n",flag);
        sleep(1);
        if(flag==1){
            printf("no\n");
            flag=0;
        }
    }
}

我有四个问题:

  1. 一开始我没有写sleep(1),它可以进入函数sigint(),改变标志值,从printf可以看出。但是,没有我预期的 "no" 输出。

  2. 我添加了休眠功能后,效果很好。我想 while 循环会每 1 秒检查一次 flag,如果 flag=1 则输出 "no"。但是,似乎每次按 ctrl+c 时都会输出 "no"。为什么不等待一秒钟?

  3. 问题说"You should not use 'sleep()' to wait 10 seconds. Use alarm(), coupled with a loop."我想知道如何在没有sleep()的情况下实现这个。

  4. kill命令无法调用sigkill函数,如何解决?

  1. 一般来说,信号只能在您的应用程序对内核进行系统调用时被 "caught"。如果你做一个普​​通的 while(1) { if (flag==1){...} },那将永远不会调用内核。理论上,当您在 while(1) 循环中执行外部 printf 时,应该会调用内核,因此可以捕获信号。
  2. sleep()被任何信号打断。查看 sleep(3).
  3. 的手册页
  4. 查看 alarm(2) 的手册页。
  5. 您不能更改 SIGKILLSIGSTOP 的信号处理程序。这些信号效果被硬编码到内核中。来自 sigaction(2):

    signum specifies the signal and can be any valid signal except SIGKILL and SIGSTOP.

    没有参数的kill命令不会产生SIGKILL信号;它生成 SIGTERM.