首页 > 代码库 > unix网络编程

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 //阻塞设置的demo2 sigemptyset(&mask);3 sigaddset(&mask, SIGCHLD);4 sigprocmask(SIG_BLOCK, &mask, NULL);

 

回到sigaction结构体的设置

//结构体设置demo.  from: <csapp>/p517/fig8.34handler_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 beejstruct sigaction sa;....sa.sa_handler = sigchld_handler;sigemptyset(&sa.sa_mask);sa.sa_flags = SA_RESTART;if (sigaction(SIGCHLD, &sa, NULL) == -1) {    ...    exit(1);}

 

 




    

unix网络编程