信号处理程序中奇怪的睡眠行为
Weird sleep behaviour inside signal handler
希望你一切顺利
我想用 C 编写一个无限循环并每 3 秒打印一次 pid 和 ppid 的程序,而不使用任何预定义的循环(no for no while ..)
问题是,当我在信号处理程序中使用睡眠系统调用时,它不会打印任何内容,但当我评论时,它会无限循环并打印我想要的内容。
这是代码
#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);
}
C 标准几乎只允许您在影响全局状态的信号处理程序中做一件事。设置一个 volatile sig_atomic_t
变量。不允许在信号处理程序中调用 printf
、sleep
等。
许多程序违反了这些规则,所以系统让其他事情正常工作,你可能很幸运,你的 printf 恰好可以工作(在某些情况下肯定不会),但我可以想到许多系统 sleep
没有机会工作。
基本上,您太过违反规则了,如果这碰巧在某些系统上有效,那只能是运气了。不是因为它是一个正确的程序。
希望你一切顺利
我想用 C 编写一个无限循环并每 3 秒打印一次 pid 和 ppid 的程序,而不使用任何预定义的循环(no for no while ..)
问题是,当我在信号处理程序中使用睡眠系统调用时,它不会打印任何内容,但当我评论时,它会无限循环并打印我想要的内容。
这是代码
#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);
}
C 标准几乎只允许您在影响全局状态的信号处理程序中做一件事。设置一个 volatile sig_atomic_t
变量。不允许在信号处理程序中调用 printf
、sleep
等。
许多程序违反了这些规则,所以系统让其他事情正常工作,你可能很幸运,你的 printf 恰好可以工作(在某些情况下肯定不会),但我可以想到许多系统 sleep
没有机会工作。
基本上,您太过违反规则了,如果这碰巧在某些系统上有效,那只能是运气了。不是因为它是一个正确的程序。