关于setitimer与子进程的问题
我是用setitimer定时产生子进程执行任务,之前在子进程的程序内没有加exit(EXIT_SUCCESS);的时候,只有第一次执行,就不会继续下去,请问这是什么原因呢?
void do_something(int signo)
{
int status, i;
for(i = 0; i < 1; i++){
status = fork();
}
if(status == 0){
printf("Child %d\n", getpid());
exit(EXIT_SUCCESS); //就是这里
}else{
printf("Parent %d\n", getpid());
wait(NULL);
}
}
void init_sigaction(void)
{
struct sigaction act;
act.sa_handler = do_something;
act.sa_flags = 0;
sigaction(SIGALRM, &act, NULL);
}
void init_time(void)
{
struct itimerval val;
val.it_value.tv_sec = 5;
val.it_value.tv_usec = 0;
val.it_interval = val.it_value;
setitimer(ITIMER_REAL, &val, NULL);
}
int main()
{
init_sigaction();
init_time();
while(1)
;
return 1;
}
------解决方案--------------------
很有意思的一个问题.
首先要注意,fork过后父子进程是共享地址空间的,copy on write时才会copy
所以在没有exit()函数的时候,子进程执行完printf("Child %d\n", getpid());会去执行while(1)循环,而父进程则一直在等待子进程结束,hung在wait()函数上, 所以父进程这时无法处理新来signal alerm信号
需要测试的话,可以在while里加一句打印当前进程id号就看得非常清楚了
int main()
{
init_sigaction();
init_time();
while(1)
{
printf("while pid %d\n", getpid());
sleep(1);
}
return 1;
}
输出结果:
while pid 27703
while pid 27703
while pid 27703
while pid 27703
while pid 27703
Parent 27703
Child 27710
while pid 27710 <===变成子进程执行while了,父进程hung住
while pid 27710
while pid 27710