Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C、linux中,关于循环中的kill signal和sleep()_C_Linux_Macos_Signals_Kill - Fatal编程技术网

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

在C、linux中,关于循环中的kill signal和sleep(),c,linux,macos,signals,kill,C,Linux,Macos,Signals,Kill,我在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

我在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;
        }
    }
}
我有四个问题:

  • 起初我没有编写sleep(1),它可以输入函数sigint(),并更改标志值,我可以从printf中看到。但是,没有我预期的“否”输出

  • 在我添加了睡眠功能后,它工作得很好。我假设while循环每1秒检查一次标志,如果标志=1,则输出“no”。但是,每次按下ctrl+c时,似乎都会显示“否”输出。为什么不等一秒钟

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

  • kill命令无法调用sigkill函数,如何修复

  • 通常,只有当应用程序对内核进行系统调用时,它才能“捕获”信号。如果您在(1){If(flag==1){…}}时执行一个普通的
    ,它将永远不会调用内核。理论上,当您在
    while(1)
    循环中执行外部
    printf
    时,应该会调用内核,从而捕获信号
  • sleep()
    被任何信号中断。检查手册页中的睡眠(3)
  • 检查手册页中的报警(2)
  • 您不能更改
    SIGKILL
    SIGSTOP
    的信号处理程序。这些信号效果被硬编码到内核中。从
    sigaction(2)

    signum指定信号,可以是除
    SIGKILL
    SIGSTOP
    之外的任何有效信号

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

  • 通常,只有当应用程序对内核进行系统调用时,它才能“捕获”信号。如果您在(1){If(flag==1){…}}时执行一个普通的
    ,它将永远不会调用内核。理论上,当您在
    while(1)
    循环中执行外部
    printf
    时,应该会调用内核,从而捕获信号
  • sleep()
    被任何信号中断。检查手册页中的睡眠(3)
  • 检查手册页中的报警(2)
  • 您不能更改
    SIGKILL
    SIGSTOP
    的信号处理程序。这些信号效果被硬编码到内核中。从
    sigaction(2)

    signum指定信号,可以是除
    SIGKILL
    SIGSTOP
    之外的任何有效信号

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


  • 您不能捕获
    SIGKILL
    -句点。不能为
    SIGKILL
    设置陷阱。顺便提一下,同上。你知道如何在没有睡眠的情况下实现它吗?
    alarm()
    sleep()
    的混合不是100%可靠的。您可以使用
    alarm()
    pause()
    -
    pause()
    仅在中断且信号处理程序返回时返回。您可以使用
    select()
    poll()
    以及特定于平台的变体进行亚秒睡眠。您可以使用
    nanosleep()
    usleep()
    进行纳秒和微秒分辨率睡眠(尽管精度通常不如分辨率好)。如果你仔细看的话,你可能会在某个地方睡上一毫秒。谢谢,你说的对!您不能捕获
    SIGKILL
    -句点。不能为
    SIGKILL
    设置陷阱。顺便提一下,同上。你知道如何在没有睡眠的情况下实现它吗?
    alarm()
    sleep()
    的混合不是100%可靠的。您可以使用
    alarm()
    pause()
    -
    pause()
    仅在中断且信号处理程序返回时返回。您可以使用
    select()
    poll()
    以及特定于平台的变体进行亚秒睡眠。您可以使用
    nanosleep()
    usleep()
    进行纳秒和微秒分辨率睡眠(尽管精度通常不如分辨率好)。如果你仔细看的话,你可能会在某个地方睡上一毫秒。谢谢,你说的对!我不太明白第三个答案。如何在没有睡眠的情况下实现它?从
    报警(2)
    的手册页:
    报警()安排在几秒钟内将信号发送到进程。
    我不太理解第三个答案。如何在无睡眠的情况下实现它?从
    报警(2)
    的手册页:
    报警()安排在几秒钟内将SIGALRM信号发送到进程。