进程间通信 ===》信号通信
应用:异步通信。 中断,,
1~64;32应用编程。
如何响应:
Term Default action is to terminate the process.
Ign Default action is to ignore the signal.
wait
Core Default action is to terminate the process and dump core (see
core(5)).
gdb a.out -c core
Stop Default action is to stop the process.
Cont Default action is to continue the process if it is currently
stopped.
kill -xx xxxx
发送进程 信号 接收进程
kill -9 1000
a.out 9 1000
1、发送端
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
功能:通过该函数可以给pid进程发送信号为sig的系统信号。
参数:pid 要接收信号的进程pid
sig 当前程序要发送的信号编号 《=== kill -l
返回值:成功 0
失败 -1;
int raise(int sig)== kill(getpid(),int sig);
功能:给进程自己发送sig信号
unsigned int alarm(unsigned int seconds);SIGALAM
功能:定时由系统给当前进程发送信号
也称为闹钟函数
闹钟只有一个,定时只有一次有效,
但是必须根据代码逻辑是否执行判断。
int pause(void);
功能:进程暂停,不再继续执行,除非
收到其他信号。
2、信号 kill -l ==>前32个有具体含义的信号
信号的含义详见图片
3、接收端
每个进程都会对信号作出默认响应,但不是唯一响应。
一般如下三种处理方式:
1、默认处理
2、忽略处理 9,19
3、自定义处理 9,19 捕获
以上三种方式的处理需要在如下函数上实现。
信号注册函数原型:
void ( *signal(int signum, void (*handler)(int)) ) (int);
typedef void (*sighandler_t)(int);
===》void (*xx)(int); == void fun(int);
===》xx是 void fun(int) 类型函数的函数指针
===》typedef void(*xx)(int) sighandler_t; ///错误
typedef int myint;
===>sighandler_t signal(int signum, sighandler_t handler);
===> signal(int sig, sighandler_t fun);
===> signal(int sig, xxx fun);
===>fun 有三个宏表示:SIG_DFL 表示默认处理
SIG_IGN 表示忽略处理
fun 表示自定义处理
自定义信号处理:
1、必须事先定义自定义函数,必须是如下格式:
void fun(int sig) sig 接收到的信息编号
{
}
2、在所有的信号中有如下两个特列:
10 SIGUSR1
12 SIGUSR2
专门预留给程序员使用的未定义信号。
Kill -l命令可以查看各个信号和其序号
数据量不大的话还是使用管道
加个!表示可读可写,