信号处理程序内部的奇怪睡眠行为

时间:2017-01-12 13:02:06

标签: c unix signals kill

希望你做得很好

我想在C中编写一个无限循环的程序,并且每3秒打印一次pid和ppid,而不使用任何预定义的循环(不会没有。)

问题在于,当我在信号处理程序中使用睡眠系统调用时,它不会打印任何内容,但是当我评论它时,它会无限循环并打印出我想要的内容。

这是代码

#include<stdio.h>
#include<stdlib.h>

#include<unistd.h>
#include<signal.h>
#include<sys/wait.h>

void handle1(int signum){
    //sleep(3); // when i remove the sleep it loop infinitly and prints 
    printf("pid=%d ppid=%d",getpid(),getppid());
    if(signum==SIGUSR1){
        kill(getpid(),SIGUSR1);
    }
}
int main(int argc , char* argv[]){    
    signal(SIGUSR1,handle1);
    kill(getpid(),SIGUSR1);
}

1 个答案:

答案 0 :(得分:3)

C标准几乎只允许你在影响全局状态的信号处理程序中做一件事。设置volatile sig_atomic_t变量。 printf等在信号处理程序中调用是不允许的。

很多程序违反了这些规则,所以系统让其他东西工作,你可能很幸运,你的printf恰好工作(有些情况肯定不会),但我可以想到许多系统{{1没有机会工作。

基本上,你违反了规则,如果这种情况发生在某些系统上,那只会是因为运气。不是因为这是一个正确的程序。