码迷,mamicode.com
首页 > 其他好文 > 详细

unix网络编程

时间:2016-10-15 14:10:28      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:

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

 

 




    

unix网络编程

标签:

原文地址:http://www.cnblogs.com/autoria/p/5963158.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!