目录
1. 什么是信号
- 信号是进程间通信的一种手段;
- 是一种事件触发机制(类似于中断机制);
- 是一种异步通信(异步通知)(是进程间通信机制中唯一一种异步手段),这种通信无法传递大量的数据;
【同步:是一种按照顺序依次执行的过程[如果某一环节没有执行,则整个过程会阻塞],通信双方实时做一件事情】
【异步:是一种使用信号或中断来实现一种事件触发过程,如果没信号或中断产生,并不会影响程序的正常执行。通信双方中任意一方不会等待[通信过程,会选择做自己的事情]】- 信号可以有一个进程发送,另外一些进程捕获,阻塞和忽略;
【捕获:收到信号后会执行相应的动作】
【阻塞:会阻塞信号的传递,直到解除阻塞,才会传递信号】
【忽略:收到信号后,不做任何处理】
(如果不给信号关联动作,则执行系统默认动作)
2. 信号的特点
- 信号无法传递大量数据
- 信号可以在任意进程间通信
- 信号是一种异步通信手段
3. Linux支持的信号
3.1 kill命令
kill命令用来给指定进程发送信号
kill -l:列举Linux中支持的信号
kill -num pid:给pid表示的进程发送num信号linux操作系统给每一个信号都配置了默认操作
信号名 | 含义 | 默认操作 |
---|---|---|
SIGHUP | 该信号在用户端连接(正常/非正常)结束时发出,通常是在终端的控制进程结束时, 通知同一会话内的各个进程与控制终端不再关联。 | 终止进程 |
SIGINT | 该信号在用户输入INTR字符串,通常时,通常ctrl+c时发出,终端驱动程序发送此信号并送到前台进程中的每一个进程。 | 终止进程 |
SIGQUIT | 该信号和SIGINT类似,但由QUIT字符(通常ctrl+\)来控制。 | 终止进程 |
SIGLL | 该信号在一个进程企图执行一条非法指令时(可执行文件本身出现错误,或者试图执行数据段、堆栈溢出时)发出。 | 终止进程 |
SIGFPE | 该信号在发生致命的算数运算错误时发出,这里不仅包括浮点运算错误,还包括溢出及除数为0等其他所有 的算数错误 | 终止进程 |
SIGKILL | 该信号用来立即结束进程的运行,并且不能被阻塞、处理和忽略 | 终止进程 |
SIGUSR1 | 留给用户自定义的信号 | |
SIGUSR2 | 留给用户自定义的信号 | |
SIGPIPE | 管道破裂的信号 | |
SIGALARM | 该信号当一个定时器的时候发出 | 终止进程 |
SIGSTOP | 该信号用于暂停一个进程,并且不能被阻塞、处理和忽略 | 暂停进程 |
SIGSTP | 该信号用于交互停止进程,用户在输入SUSP字符时,通常ctrl+z发出这个信号 | 停止进程 |
SIGCHLD | 子进程改变状态时,父进程会收到这个信号 | 忽略 |
注意
SIGKILL和SIGSTOP不能被阻塞忽略和捕获
4. 信号的操作
4.1 信号的发送——进程如何发送信号
使用kill函数给指定进程发送信号
- kill函数
/需要包含的头文件/
#include<sys/types.h>
#include<signal.h>
/*
- 函数名:kill
- 函数功能:给指定进程发送信号
- 函数参数:
————pid_t pid:指定进程的pid
————int sig:发送的信号值- 函数返回值:int:成功返回0,失败返回-1
*/
int kill(pid_t pid,int sig);
4.2 信号的捕获(给信号关联一个处理函数)——进程如何关联信号和信号处理函数
ANSI美国标准化组织——signal handling信号处理函数
linux给每个信号都关联了一个默认操作
当一个信号被接收时,接受信号的进程可以进行如下几种操作:
- 忽略
- 阻塞
- 捕获
——>默认操作
——>执行信号处理函数
使用signal函数来处理上述过程
- signal函数
/需要包含的头文件/
#include<signal.h>
/*
*定义了一个函数指针类型:sighandler_t
*该函数指针指向哪一类函数:void func(int)——这个类型的指针,指向返回void——有一个int类型参数的一类函数;
*/
typedef void(sighandler_t)(int);
/
- 函数名:signal
- 函数功能:关联一个信号和信号处理函数
- 函数参数:
————int signum:关联的信号
————sighandler_t handler:信号处理函数的函数指针(handler)指针不能为NULL
*/- sighandler_t signal(int sugnum,sighandler_t handler);
函数返回值:sighandler_t:成功返回之前信号处理函数的指针,失败返回SIG_ERR- handler的特殊取值:
——SIG_IGN:忽略信号
——SIG_DFL:执行默认操作
5. 示例
5.1 示例1
#include<stdio.h>
#include<sys/types.h>
#include<signal.h>
#include<stdlib.h>
#include<unistd.h>
void func(int signum)
{
if(SIGUSR1 == signum)
{
puts("recv this signal");
exit(0);
}
}
int main()
{
signal(SIGUSR1,func);
while(1)
{
puts("hello world!");
sleep(1);
}
return 0;
}
5.2 示例2
#include<sys/types.h>
#include<signal.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
char buf[20] = {0};//定义一个数组
gets(buf);
pid_t pid = atoi(buf);
kill(pid,SIGUSR1);
return 0;
}