CSAPP笔记(第八章 异常控制流)-02

第八章的内容为p537~p586, 分2部分, p537~p562, p563~p586. 本文为第2部分.

摘要

这章看的很乱, 先记录下.

信号

软件形式的异常, 称为Linux信号, 允许进程和内核中断其他进程.

如果一个进程除0, 内核就给它发送一个SIGFPE信号; 如果一个进程执行一条非法指令, 内核就给它发送一个SIGILL信号.

信号术语

传送一个信号由2个部分组成, 发送信号和接收信号.
发送信号: 内核通过更新进程上下文中的某个状态, 发送一个信号给进程.
接收信号: 当目的进程被内核强迫以某种方式对信号的发送做出反应时, 它就接收了信号. 进程可以忽略这个信号, 或者执行信号处理程序捕获这个信号.

任何时刻, 一种类型至多只会有一个待处理信号. 一个待处理信号最多只能被接收一次. 内核为每个进程在pengding位向量中维护着待处理信号的集合, 只要传送了一个类型为k的信号, 内核就会设置pengding中的第k位, 而只要接收了一个类型为k的信号, 内核就会清除第k位.

发送信号

#include <unistd.h>
pid_t getpgrp(void); //返回调用进程的进程组ID

int setpgid(pid_t pid, pid_t pgid);//设置进程组ID, 成功返回0, 否则返回-1
/bin/kill -9 15213 //给进程15213发送信号9(SIGKILL)

Ctrl+C会导致内核发送一个SIGINT(终止)信号到前台进程组的每个进程组.
Ctrl+Z会发送一i个SIGTSTP(挂起)信号到前台进程组的每个进程.

#include <sys/types.h>
#include <signal.h>

int kill(pid_t pid, int sig);//进程通过调用kill函数发送信号给其它进程(包括自己). 成功返回0, 失败返回-1
#include <unistd.h>
unsigned int alarm(unsigned int secs);//定时处理程序, 参考[linux定时器之alarm](https://blog.csdn.net/u010155023/article/details/51984602)

接收信号

当内核把进程p从内核模式切换到用户模式时, 它会检查进程p的未被阻塞的待处理信号的集合(pending & ~blocked), 如果这个集合为空, 则执行下一条指令\(I_{next}\)

猜你喜欢

转载自www.cnblogs.com/winwink/p/11786107.html