signal 杂谈

 1 signal 实例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <setjmp.h>
 
#define MAXLINE 1024

static jmp_buf env_alrm;
static void sig_alrm(int signo);
 
int main(void)
{
    int     n;  
    char    line[MAXLINE]; 
//hold(wait) SIGALRM in background. the code don;t block here
    if (signal(SIGALRM,sig_alrm)==SIG_ERR)
        printf("signal(SIGALRM) error\n");
// setjmp is flag
// there is a benefit for adding jmp.  code can not run sequence ,can go anywhere 
    if (setjmp(env_alrm)!=0) {
        printf("read timeout\n");
        exit (-1);
    }
//after 10s send SIGALR; it doesn't block here 
//trigger signal,it is a interrupt
   alarm(10);
//read is block
   if ((n=read(STDIN_FILENO,line, MAXLINE))<0) {
        printf("read error\n");
        alarm(0);
        write(STDOUT_FILENO,line,n);
        exit (0);
    }
// go to setjmp flag
static void sig_alrm(int signo)
{
longjmp(env_alrm,1);
}

2 信号sigsuspend终于搞懂了。道路是曲折的。

2.1 如有无信号处理函数。zeromask和waitmask区别。两者对pause和sigsuspend的不同.
对信号是不是pending。非mask的信号处理。
testcase的情况很多。易混淆.

pause和sigsuspend:

comments: sigpromask 的mask 和sigsuspend的pendmask 没有关系。这是两个不同的mask。互相不影响。

sigprocmask是为pause用的,如设置mask为block ,SIGQUIT。则pause将ignore SIGQUIT。

对sigsuspend没有任何影响。 

对于sigsuspend 根据自己的pendmask在决定做什么。

如果其不是empty,mask是SIGQUIT,则block SIGQUIT。

如果是empty,则接收任何信号。在pendmask会保存这个信号。

2.2 signal函数是非block的,在后台。类似捕获中断,捕获信号。然后用函数处理信号。是接收信号,

与发送信号没关系。

alarm,kill 等才是发送信号。

wait是等待进程结束,和信号没关系

2.3 sigsuspend 和sigprocmask 使用上没有任何关系。但是它们是固定搭配。

在sigsuspend之前,先save current signal mask。在sigsuspend之后,restore signal mask。

//保存当前信号屏蔽字

if (sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)
if (sigsuspend(&waitmask))

// 恢复原来的信号屏蔽字

if(sigprocmask(SIG_SETMASK,&oldmask,NULL))

sigpromask(0,NULL,&sigset) 这句很主要。这句是get current signal。不是清空.

2.4 信号还有一些其他函数:sigemptyset, sigaddset, sigismember

signal和sigset 一样。sigaction是signal的升级版

2.5 abort函数
abort()是使异常程序终止,同时发送SIGABRT信号给调用进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值