信号:系统定义好的某些特定事件,事件可以被产生,也可以被接收,产生和接收事件的主体都是进程。
信号的响应方式(进程接收后如何处理):忽略、 默认、 自定义(捕获)
SIG_DFL SIG_IGN
修改信号响应方式:
typedef void(*Fun)(int);
Fun signal(int signum, Fun fun);//注册函数
发送信号类型:sigint SIGINT
sigchld SIGCHLD
异步执行:两个以上的进程或者线程,执行互不影响,同时向下执行,当需要其他进程的某些执行条件时,不需等待,仍继续处理后续工作,当某个时刻,其他进程或线程完成所需的某种条件时,会通过系统机制通知该进程或线程,在处理之前的请求。
同步执行:两个或两个以上进程(或线程),其中一个进程或线程的执行需要依赖其他进程或线程的执行条件。会不停的探测,直到其他进程完成其执行条件。
阻塞:进程在运行的过程中缺少某种条件而被挂起等待。
非阻塞:进程在运行过程中缺少某种条件不停止运行一直做其他的事直到该条件满足。
同步异步指两个进程之间的关系,而阻塞非阻塞是指一个进程本身的状态。
信号的发送:int kill( pid_t pid , int sigtype); //系统调用函数
将信号发送给哪个进程 发送的信号类型
Pid > 0 指定接收信号的进程的PID
Pid == 0 将信号发送给当前进程组中所有的进程
Pid == -1 将信号发送给系统上所有的进程(有权限发送)
Pid < -1 将信号发送给进程组ID为-PID组内所有的进程
每个进程属于一个进程组,进程组有进程组组长,进程组组长的PID为进程组ID。
进程组:是一个或多个进程的集合,每一个进程组有一个唯一的进程组ID。 会话:是一个或多个进程组的集合。
kill(1234,SIGINT); ====> SIGINT == 2 (SIGINT信号的值为2,ctrl c触发)
| 通过用户态切换内核态一系列操作调用底层的一个函数
sys_kill(1234,2); 0.11版本
struct task_struct 是进程PCB的结构体,定义了一个二级指针,NR_TASKS的值是64
task 是进程表,0.11版本系统维护进程的PCB时是用存放指针的数组来维护的。
NR_TASKS是该数组的大小,
struct task_struct **p = NR_TASKS + task;此时该指针P指向数组的最后一个位置。
if判断,当PID为0时,下面代码就实现了信号发送给当前进程的进程组中所有进程,elseif PID>0时,是怎么样实现信号发送给指定接收信号的进程的,以及后面==-1时、< -1时都是怎么样实现对应状况的。