ngix源码分析前的准备工作

最近在开发与应用端交互的php代码,一些基本的linux下编程变得比较生疏,因此对照《unix环境高级编程》进行ngix内容开发的再次学习。

首先关注的ngx中一些基本的信号处理内容

sigemptyset()用来将参数set信号集初始化并清空。

sigaddset()用来将参数signum 代表的信号加入至参数set 信号集。

int sigprocmask (int __how, __const sigset_t *__restrict __set,sigset_t *__restrict __oset)用于阻塞当前进程中的信号集合

附上一篇较好的关于信号阻塞的分析文章

http://blog.csdn.net/muge0913/article/details/7334771


int sigsuspend (__const sigset_t *__set)

在标准库的中解释为

This function replaces the process's signal mask with set and then suspends the process until a signal is  delivered whose action is either to terminate the process or invoke a signal handling function. In other  words, the program is effectively suspended until one of the signals that is not a member of set arrives. 
     If the process is woken up by delivery of a signal that invokes a handler function, and the handler function  returns, then sigsuspend also returns. 
     The mask remains set only as long as sigsuspend is waiting. The function sigsuspend always restores the  previous signal mask when it returns. 
The return value and error conditions are the same as for pause
.

理解一下便是将当前的屏蔽信号集变为set中内容,同时系统进程挂起,当接受到一个非屏蔽的信号时,回复到从前的信号mask码。 

下面为一个测试的小程序:

void test(int signalnum){
if(signalnum == SIGUSR1){
printf("get the signal usr1");
}
if(signalnum == SIGUSR2){
printf("get the signal usr2");
}
return;
}
int main(int argc,char *argv[]){
sigset_t tmp;
struct sigaction signal_t;
sigemptyset(&signal_t.sa_mask);
signal_t.sa_flags=0;
signal_t.sa_handler=test;
sigaction(SIGUSR1,&signal_t,NULL);
sigaction(SIGUSR2,&signal_t,NULL);
sigemptyset(&tmp);
sigprocmask(0,NULL,&tmp);
sigaddset(&tmp,SIGUSR1);
sigsuspend(&tmp);
exit(0);
}

这个小测试程序的在运行到sigsuspend的时候会挂起,当发送kill -10 pid 的时候,当前程序不会有任何反映,因为10(SIGUSR1) 已经被屏蔽,当发送12(SIGUSR2)时,程序接受到SIGUSR1/SIGUSR2两个信号内容。

附上一篇较好的分析文章:http://blog.chinaunix.net/uid-26885237-id-3206640.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值