1.什么是信号:
信号是UNIX系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。
比如内存段冲突、浮点处理器错误或者非法指令等
信号模拟的是硬件中断方式,它传递的信息很少,可以用来做进程间的通知或者错误的警告等
信号就是【进程间通信】的一种方式,它采用异步工作的方式(qt的信号与槽,线程)
2.信号类型:
linux中的指令:kill -l
总共定义了31*2种信号,分为可靠信号(34-64)与不可靠信号(1-31)
linux信号机制基本上是从unix系统中继承过来的。早期unix系统中的信号有1-31的信号
kill命令:kill -9 进程号 (发送9号信号)
3.信号的产生
硬件方式:ctrl+c(结束进程),出错
软件方式:发送信号的系统调用,例如kill
4.信号的安装
安装:设置信号的关联动作(当信号发生时要做什么事)
signal函数原型:
void signal(int sig, void (*func)(int))(int);
参数:
sig:要安装的信号的编号(上面截图不同信号前面的编码)
func:信号处理器(信号处理函数)
注:SIGKILL:是一个特殊的信号,即便被安装,也依然会执行默认动作(停止当前进程)
5.使用代码来发送信号
系统调用函数kill (发送信号)
int kill(pid_t pid, int sig);
参数:
pid:进程号(要发送信号的目标进程号)
- pid>0:向指定的进程号发送信号
- pid==0:向同组的进程发送信号
- pid==-1:向所有进程发送信号(但不包括初始进程和部分系统进程)
- pid<-1:向进程组id为pid的所有进程发送信号
sig:信号编号
返回值:成功返回0,错误返回-1
可靠信号:在程序运行速度很快,连续发送信号之间不需要sleep
不可靠信号:在程序运行速度很快,连续发送信号之间需要sleep,不然系统会忽略
6.带参信号的发送与处理
6.1、sigaction信号安装函数(替代之前的signal)
int sigaction(int signum,const struct sigaction *act,const struct sigaction *old);
参数:
signum:信号编号
act:指向新的信号处理器设置指针
old:填NULL
struct sigaction {
void (*sa_handler)(int); // 信号处理器函数
void (*sa_sigaction)(int, siginfo_t *, void *); // 用于支持实时信号
sigset_t sa_mask; // 在信号处理期间需要屏蔽的信号集
int sa_flags; // 信号处理选项
};
6.2、sigqueue信号发送函数(替代之前的kill)
int sigqueue(pid_t pid, int sig, const union sigval value);
参数:pid:进程号(要发送信号的目标进程号)
sig:信号编号
value:用于传递附加数据的联合体
union sigval {
int sival_int; // 整数值
void *sival_ptr; // 指针值
};
进行数据传参
void demo4_handle(int signum,siginfo_t* info,void *v)
{cout << "signum:" << signum << endl;//携带数据cout << "value:" << info->si_value.sival_int << endl;
}void demo4()
{pid_t pid = 0;pid = fork();if (pid < 0){perror("fork error");}if (pid == 0){struct sigaction action;//信号处理器参数配置结构体action.sa_flags = SA_SIGINFO;//配置信号处理器类型为可携带参数类型action.sa_sigaction = demo4_handle;//配置信号处理函数//信号安装sigaction(SIGRTMIN, &action, NULL);while (1){}}else{sleep(1);union sigval val;val.sival_int = 10000;//要携带的数据(必须是整型)sigqueue(pid, SIGRTMIN, val);}
}