unix网络编程

先来考虑信号处理
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);
}

 

 




    
posted @ 2016-10-15 12:40  autoria  阅读(296)  评论(0编辑  收藏  举报