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

被折叠的 条评论
为什么被折叠?



