Linux内核之信号在内核表示

执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。信号在内核中的表示可以看作是这样的:

sigprocmask(修改block的值)

#include <signal.h> int sigprocmask(int how, const sigset_t *set, sigset_t *oset); 功能:读取或更改进程的信号屏蔽字。 返回值:若成功则为0,若出错则为-1 如果oset是非空指针,则读取进程的当前信号屏蔽字通过oset参数传出。如果set是非空指针,则更改进程的信号屏蔽字,参数how指示如何更改。如果oset和set都是非空指针,则先将原来的信号屏蔽字备份到oset里,然后根据set和how参数更改信号屏蔽字。假设当前的信号屏蔽字为mask,下表说明了how参数的可选值。

                                                                               how参数表示

sigpending(未决状态获取)

#include <signal.h> int sigpending(sigset_t *set); 功能: sigpending读取当前进程的未决信号集,通过set参数传出。 返回值:若成功则为0,若出错则为-1

#include <unistd.h>

#include <signal.h>

#include <stdio.h>

void printsigset(sigset_t* set)

{        

int i;        

for (i=1;i<64;i++)        

{                

if (sigismember(set,i))                        

    putchar('1');                

else                        

   putchar('0');        

}        

puts("");

}

void handler(int sig) {        

if (sig==SIGQUIT)        

{                

sigset_t s;                

sigemptyset(&s);                

sigaddset(&s,SIGINT);                

sigprocmask(SIG_UNBLOCK,&s,NULL);        

}        

if (sig==SIGINT)      

  {                

    printf("recv a signal %d\n",sig);  

  }

}

sigaction库函数(安装信号升级)

包含头文件<signal.h> 功能:sigaction函数用于改变进程接收到特定信号后的行为。 原型: int  sigaction(int signum,const struct sigaction *act,const struct sigaction *old); 参数 该函数的第一个参数为信号的值,可以为除sigkill及sigstop外的任何一 个特定有效的信号(为这两个信号定义自己的处理函数,将导致信号安装错误) 第二个参数是指向结构sigaction的一个实例的指针,在结构 sigaction的实例中,指定了对特定信号的处理,可以为空,进程会以缺省方式对信号处理 第三个参数oldact指向的对象用来保存原来对相应信号 的处理,可指定oldact为null。 返回值:函数成功返回0,失败返回-1

第二个参数最为重要,其中包含了对指定信号的处理、信号所传递的信息、信号处理函数执行过程中应屏蔽掉哪些函数等等

struct sigaction {    

union   {    

__sighandler_t _sa_handler;  

void (*_sa_sigaction)(int,struct siginfo *, void *);

}_u

sigset_t sa_mask;

unsigned long sa_flags;

void (*sa_restorer)(void);

}

联合数据结构中的两个元素_sa_handler以*_sa_sigaction指定信号关联函数,即用户指定的信号处理函数。除了可以是用户自定义的处理函数外,还可以为sig_dfl(采用缺省的处理方式),也可以为sig_ign(忽略信号)。 由_sa_handler指定的处理函数只有一个参数,即信号值,所以信号不能传递除信号值之外的任何信息;由_sa_sigaction是 指定的信号处理函数带有三个参数,是为实时信号而设的(当然同样支持非实时信号),它指定一个3参数信号处理函数。第一个参数为信号值,第三个参数没有使 用(posix没有规范使用该参数的标准),第二个参数是指向siginfo_t结构的指针,结构中包含信号携带的数据值。

sigqueue库函数(发送信号升级)

功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用。 原型:     int sigqueue(pid_t pid, int sig, const union sigval value); 参数  sigqueue的第一个参数是指定接收信号的进程id,第二个参数确定即将发送的信号,第三个参数是一个联合数据结构union sigval,指定了信号传递的参数,即通常所说的4字节值。 返回值成功返回0,失败返回-1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值