最近学习linux进程间通信时学习pause()函数,遇到点小疑问请教下大家:
首先,我看到这样一句话,pause捕获到信号将会直接终止进程。于是我进行了相关实验:
最后的printf并没有打印。
但是,当我做了另一个实验,我产生了疑惑:
这里,我的理解是:当alarm定时器走到第20s后,signal函数将会触发SIGALRM,然后调用func函数.
请问:
这里的pause捕获到信号为什么没有直接终止进程?(后面的printf打印了)
我不知道是否是应为sinal函数引起的或者是其他的原因,所以请教下大家。
源码:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(){
alarm(5);
pause();
printf("I have been awaken up \n");
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void func(){
printf("I have been awaken up\n");
system("date");
}
int main(){
signal(SIGALRM,func);
system("date");
alarm(20);
pause();
printf("why print???");
return 0;
}
对于函数
unsigned int alarm(unsigned int seconds);
如果参数seconds
大于 0,则seconds
秒后,系统将向进程发送SIGALRM
信号,该信号的默认行为是终止进程。对于函数
int pause(void);
作用是,将进程或线程休眠,直到收到信号导致进程被终止或被信号处理函数处理,对于后者,如果信号处理函数不退出进程,在调用信号处理函数之后,pause()
将返回,继续执行其后的程序。具体分析如下:
第一个程序:
执行如下,
alarm(5);
告诉系统,5s 后向进程发送SIGALRM
信号pause();
使进程处于休眠的状态SIGALRM
信号后,因为没有信号处理函数,该信号的默认行为是终止进程,所以进程退出第二个程序:
执行如下:
signal(SIGALRM,func);
设置SIGALRM
信号处理函数。system("date");
打印日期alarm(20);
告诉系统,20s 后向进程发送SIGALRM
信号pause();
使进程处于休眠的状态SIGALRM
信号后,调用信号处理函数,func()
printf("why print???");
输出参见: