gpt4 book ai didi

c - 在 C、linux 中,关于 kill signal 和 sleep() in loop

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:33 25 4
gpt4 key购买 nike

我在 Mac OS 上运行我的 C 程序。我的程序的一部分如下。此代码在 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(),改变flag值,从printf可以看出。但是,没有像我预期的那样输出“no”。

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

  3. 问题说“你不应该使用‘sleep()’来等待 10 秒。使用 alarm(),再加上一个循环。”我想知道如何在没有 sleep() 的情况下实现它。

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

最佳答案

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

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

    不带参数的kill 命令不会生成SIGKILL 信号;它生成 SIGTERM

关于c - 在 C、linux 中,关于 kill signal 和 sleep() in loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39338347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com