希望你做得很好
我想在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);
}
答案 0 :(得分:3)
C标准几乎只允许你在影响全局状态的信号处理程序中做一件事。设置volatile sig_atomic_t
变量。 1}},printf
等在信号处理程序中调用是不允许的。
很多程序违反了这些规则,所以系统让其他东西工作,你可能很幸运,你的printf恰好工作(有些情况肯定不会),但我可以想到许多系统{{1没有机会工作。
基本上,你违反了规则,如果这种情况发生在某些系统上,那只会是因为运气。不是因为这是一个正确的程序。