13-01-25-->10

本文介绍了计算机操作系统中信号处理的基本概念和技术,包括信号的种类、处理方式及其在进程控制中的应用。探讨了信号如何帮助进程应对异常情况,并通过具体函数如signal、kill等解释了信号的发送与捕获。

信号

SIG开头,为一个正整数,没有信号编号为0的信号。

软件也有可能产生一些信号。e.g.在管道中,读进程已经进行结束而写进程还在向管道中写数据,就会产生SIGPIPE信号。

内核对信号的三种处理:1.忽略信号,但SIGKILL,SIGSTOP这两个信号不可被忽略 2.捕捉(catch)信号3.使用缺省的处理函数,针对大多数信号的系统默认动作是终止进程。


signal函数

void  (*signal(int signo, void (*func)(int )))(int );

返回值则是指向之前的信号处理程序的指针。

函数限制:不改变信号的处理方式就不能确定信号的当前处理方式。


SIGTERM 这是由kill命令发送的系统默认终止信号。


中断的系统调用

系统调用分为2类:1,低速系统调用 2.其他系统调用。

自动重启动的系统调用包括:ioctl,read,readv,write,writev,wait,waitpid


大多函数是不可重入的,其原因为:1,已知它们使用静态数据结构 2.它们调用malloc 或free 3.它们是标准I/O函数。


信号分类:

1.不可靠信号

2.可靠信号

当进程开始对信号进行处理时,我们称信号被发送(delivered)给了进程,在信号产生到信号被发送之间的时间内,称信号是未决的,被挂起(pending)。

进程有一个选项来决定是否阻塞(blocking)信号的发送(delivered)。如果信号被阻塞,信号将一直处于挂起(pending)状态,直到解除对信号的阻塞或者将对信号的处理(action)改变为忽略信号。

内核在递送一个原来被阻塞的信号给进程时(而不是在产生该信号时),才决定对它的处理方式。于是进程在信号递送给他之前可改变对该信号的动作。


kill和raise函数

kill函数将信号发送给进程或进程组。

raise函数允许进程向自身发信号。

进程发信号的权限:1.超级用户可将信号发给任一进程 2.对于非超级用户,发送者的实际或有效用户ID必须等于接受者的实际或有效用户ID.

特例:SIGCONT信号,进程可将它发送给属于同一会话的任何其他进程。


alarm和pause函数

SIGALRM的默认动作是终止进程,大多数使用闹钟的进程都会捕捉此信号。

pause函数让调用进程挂起直至捕捉到一个信号。


如果我们要对I/O操作加时间限制,可以用longjmp函数,但它有可能导致其他信号的处理函数退出,另一个解决办法是用select函数和poll函数。


进程将信号发送给其他进程需要权限。超级用户可将信号发送给任一进程。对于非超级用户,其基本规则是发送者的实际or有效用户ID必须等于接受者的实际or 有效用户ID.


sigpending函数返回在送往进程的时候被阻塞挂起的信号的集合。

int  sigpending(sigset_t  *set);


sigaction函数

int sigaction(int signumber, const struct sigaction * act, struct sigaction * oact);


sigsetjmp和siglongjmp函数

在信号处理程序中进行非局部转移时应当使用这两个函数,可以设置是否保存信号屏蔽字。


sigsuspend函数

sigsuspend的整个原子操作过程为:
(1) 设置新的mask阻塞当前进程;
(2) 收到信号,恢复原先mask;
(3) 调用该进程设置的信号处理函数;
(4) 待信号处理函数返回后,sigsuspend返回。


abort函数

abort函数,是一个让程序运行非正常结束的函数。给进程发送SIGABRT信号,进程不能忽略这个信号。




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值