1 signal 实例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <setjmp.h>
#define MAXLINE 1024
static jmp_buf env_alrm;
static void sig_alrm(int signo);
int main(void)
{
int n;
char line[MAXLINE];
//hold(wait) SIGALRM in background. the code don;t block here
if (signal(SIGALRM,sig_alrm)==SIG_ERR)
printf("signal(SIGALRM) error\n");
// setjmp is flag
// there is a benefit for adding jmp. code can not run sequence ,can go anywhere
if (setjmp(env_alrm)!=0) {
printf("read timeout\n");
exit (-1);
}
//after 10s send SIGALR; it doesn't block here
//trigger signal,it is a interrupt
alarm(10);
//read is block
if ((n=read(STDIN_FILENO,line, MAXLINE))<0) {
printf("read error\n");
alarm(0);
write(STDOUT_FILENO,line,n);
exit (0);
}
// go to setjmp flag
static void sig_alrm(int signo)
{
longjmp(env_alrm,1);
}
2 信号sigsuspend终于搞懂了。道路是曲折的。
2.1 如有无信号处理函数。zeromask和waitmask区别。两者对pause和sigsuspend的不同.
对信号是不是pending。非mask的信号处理。
testcase的情况很多。易混淆.
pause和sigsuspend:
comments: sigpromask 的mask 和sigsuspend的pendmask 没有关系。这是两个不同的mask。互相不影响。
sigprocmask是为pause用的,如设置mask为block ,SIGQUIT。则pause将ignore SIGQUIT。
对sigsuspend没有任何影响。
对于sigsuspend 根据自己的pendmask在决定做什么。
如果其不是empty,mask是SIGQUIT,则block SIGQUIT。
如果是empty,则接收任何信号。在pendmask会保存这个信号。
2.2 signal函数是非block的,在后台。类似捕获中断,捕获信号。然后用函数处理信号。是接收信号,
与发送信号没关系。
alarm,kill 等才是发送信号。
wait是等待进程结束,和信号没关系
2.3 sigsuspend 和sigprocmask 使用上没有任何关系。但是它们是固定搭配。
在sigsuspend之前,先save current signal mask。在sigsuspend之后,restore signal mask。
//保存当前信号屏蔽字
if (sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)
if (sigsuspend(&waitmask))
// 恢复原来的信号屏蔽字
if(sigprocmask(SIG_SETMASK,&oldmask,NULL))
sigpromask(0,NULL,&sigset) 这句很主要。这句是get current signal。不是清空.
2.4 信号还有一些其他函数:sigemptyset, sigaddset, sigismember
signal和sigset 一样。sigaction是signal的升级版
2.5 abort函数
abort()是使异常程序终止,同时发送SIGABRT信号给调用进程。