1.核心理论-信号
在Linux系统中,信号(signal)同样也是最为古老的进程 间通信机制
信号来源
- 程序错误:除零,非法内存访问…
- 外部信号:终端Ctrl-C产生SGINT信号,定时器到期产生SIGALRM…
- 显式请求:kill函数允许进程发送任何信号给其他进程或进程组。
信号处理流程
进程对信号的响应
忽略信号:大部分信号可被忽略,除SIGSTOP和SIGKILL信号外(这是超级用户杀掉或停掉任意进程的手段)。
捕获信号:注册信号处理函数,它对产生的特定信号做处理。
让信号默认动作起作用:unix内核定义的默认动作,有5种情况:
a) 流产abort:终止进程并产生core文件。
b) 终止stop:终止进程但不生成core文件。
c) 忽略:忽略信号。
d) 挂起suspend:挂起进程。
e) 继续continue:若进程是挂起的,则resume进程,否则忽略此信号。
信号类型
2.函数学习-信号操作
发送信号 kill
函数原型
int kill(pid_t pid, int sig);
函数功能
向进程发送信号
所属头文件
<sys/types.h><signal.h>
返回值
成功 0 失败 -1
参数说明
pid pid>0 指向接收信号的进程 sig 要发送的信号
处理信号 signal
函数原型
typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
函数功能
设置信号的处理方式
所属头文件
<signal.h>
返回值
成功: 返回处理函数的指针 失败SIG_ERR
参数说明
signum, 要处理的信号 handler 对应信号的处理方式 可以取值 1 SIG_IGN (忽略信号) 2 SIG_DFL (交给内核处理) 3 用户自定义函数: 交给用户来处理
3.综合实例编程
A,B进程利用信号通讯
/* send_sig.c */ #include <sys/types.h> #include <signal.h> #include <stdlib.h> void main(int arvc, char* argv[]) { pid_t pid = 0; pid = atoi(argv[1]); kill(pid, SIGINT); puts("Signal was sent."); }
/* read_sig.c */ #include <signal.h> #include <unistd.h> #include <stdio.h> void myfunc(int num) { puts("Process sd_proc received SIGINT."); } void main() { signal(SIGINT, myfunc); pause(); }