标签:
先来考虑信号处理
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
该函数用来修改收到一个信号时的处理方式。
参数act用来指定新处理方式,oldact用来保存先前的处理方式。
处理方式保存在一个结构中
struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); };
其中sa_handler, sa_mask, sa_falgs比较常用,sa_handler指向处理函数, sa_mask用于设置阻塞,sa_flags用于修改信号的行为。
sa_mask是一个位向量掩码(在实现I/O mutiplexing的select函数中也有位向量掩码)
1 //阻塞设置的demo 2 sigemptyset(&mask); 3 sigaddset(&mask, SIGCHLD); 4 sigprocmask(SIG_BLOCK, &mask, NULL);
回到sigaction结构体的设置
//结构体设置demo. from: <csapp>/p517/fig8.34 handler_t *Signal(int signum, handler_t *handler) { struct sigaction action, old_action; sigemptyset(&action.sa_mask); //Block sigs of type being handled action.sa_flags = SE_RESTART; //Restart syscalls if possible if (sigaction(signum, &action, &old_action) < 0) unix_error("Signal error"); return (old_acion.sa_handler); }
//结构体设置demo2. from beej struct sigaction sa; .... sa.sa_handler = sigchld_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if (sigaction(SIGCHLD, &sa, NULL) == -1) { ... exit(1); }
标签:
原文地址:http://www.cnblogs.com/autoria/p/5963158.html