关于linux中pause()函数的疑问
最近学习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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
对于函数
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???");
输出参见:
man page 里写了。
如果信号被截获并且信号处理函数返回了,那么 pause 就会返回,也就是不会终止进程。
pause()
可以捕获信号。SIGALRM
信号的处理函数,默认情况下,该函数不会返回,它会终止进程,因此pause()
后面的代码没有机会执行。SIGALRM
信号的处理函数,并且该函数返回了,连带触发pause()
返回,进而执行后续代码。参考资料
SIGALRM
默认处理函数,参考 glibc 源码文件 hurd/hurdsig.c , https://sourceware.org/git