linux信号处理编程实验报告,Linux编程之信号处理

信号是类Unix系统中的一种通知机制。在Linux下,我们可以通过kill -l命令来查看有哪些信号。Linux下有64个信号,其中前32个信号是经典信号,后32个是用于驱动开发要用到的。

那么信号是如何产生的呢?主要有以下几种方式可以产生信号:

1.终端的特殊按键。比如说ctrl + d,ctrl + c等

2.kill 命令及函数。

3.硬件异常。如:非法访问内存,除零操作。

4.某些软条件已经发生。如:定时器alarm到时。

我们已经知道了信号是如何产生的,那么进程是如何对这些进程进行处理的呢?Linux系统对这些经典信号提供了3种处理方式。

第一种是默认处理方式。在默认处理方式下,信号有5种默认的动作,Term,Ign,Core,Stop,Cont,以下是它们的说明:

1.Term:终止当前进程

2.Ign:忽略该信号

3.Core:终止当前进程并且产生Core文件(用于调试用的)

4.Stop:暂停当前进程

5.Cont:继续执行先前暂停的进程

第二种是忽略该信号。注意这里的忽略和第一种情况下的Ign所在的层级是不一样的。

我们先来看下信号是如何响应的,在Linux的进程内核空间中,有两个信号集,一个是未决信号集,只能被内核进行读写,用户不能去修改它,但能去读它。还有一个是信号屏蔽字,这个用户可以设置它。当有信号产生时,未决信号集里刚产生的那个信号位会被内核自动设置为1,表示该信号产生了。接下来,如果信号屏蔽字中对应的信号屏蔽字位为0,说明该信号没有被屏蔽,可以去执行信号的动作。若被屏蔽了,则该信号不能被响应,直到屏蔽字位为0。当执行完该信号的动作后,内核会将该信号的未决信号位设置为0。我们有几个函数来对信号集进行设置,sigemptyset(将信号集全部置0),sigfillset (信号集置1),sigaddset (某一位置1),sigdelset (某一位0),sigismember (判断某一位是否为1),还有调用函数sigprocmask可以读取或更改进程的信号屏蔽字。

介绍了信号集,我们来看下第三种处理方式。第三种是自定义信号处理。我们可以通过sigaction函数来设置信号的处理动作。该函数的第二个参数是一个名为struct sigaction 的结构体,其声明如下:

struct sigaction {

void (*sa_handler)(int);//信号处理函数。早期版本的

void (*sa_sigaction)(int, siginfo_t *, void *);//信号处理函数,若使用这个就不能使用上一个,这个成员和上一个成员是互斥的,只能使用同一个

sigset_t sa_mask;//临时的信号屏蔽字,通过该成员可以设置其它信号的屏蔽位,执行完处理函数后,返回原有的信号屏蔽字

int sa_flags;//选择使用哪个信号处理函数,0表示使用早期版本的,SA_SIGINFO表示使用第二种

void (*sa_restorer)(void);//保留的,没有用

};以下是该函数的使用示例:

#include #include void do_sig(int num)

{

//会打印该信号的编号

printf("num = %d\n",num);

}

int main(void)

{

struct sigaction act;

//设置信号处理函数

act.sa_handler = do_sig;

//将临时信号屏蔽字全设置为0

sigemptyset(&act.sa_mask);

act.sa_flags = 0;

//设置SIGINT信号使用自定义处理该信号

sigaction(SIGINT,&act,NULL);

while(1)

{

printf("*********\n");

sleep(1);

}

return 0;

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值