【嵌入式总复习】Linux信号(超超超~~~详解)

进程间的通信方式有五种,分别为:管道,信号量,共享内存,消息队列和套接字

1. 什么是信号

  1. 信号是进程间通信的一种手段;
  2. 是一种事件触发机制(类似于中断机制);
  3. 是一种异步通信(异步通知)(是进程间通信机制中唯一一种异步手段),这种通信无法传递大量的数据;
    【同步:是一种按照顺序依次执行的过程[如果某一环节没有执行,则整个过程会阻塞],通信双方实时做一件事情】
    【异步:是一种使用信号或中断来实现一种事件触发过程,如果没信号或中断产生,并不会影响程序的正常执行。通信双方中任意一方不会等待[通信过程,会选择做自己的事情]】
  4. 信号可以有一个进程发送,另外一些进程捕获,阻塞和忽略;
    【捕获:收到信号后会执行相应的动作】
    【阻塞:会阻塞信号的传递,直到解除阻塞,才会传递信号】
    【忽略:收到信号后,不做任何处理】
    (如果不给信号关联动作,则执行系统默认动作)

2. 信号的特点

  1. 信号无法传递大量数据
  2. 信号可以在任意进程间通信
  3. 信号是一种异步通信手段

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函数给指定进程发送信号

  1. 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给每个信号都关联了一个默认操作
当一个信号被接收时,接受信号的进程可以进行如下几种操作:

  1. 忽略
  2. 阻塞
  3. 捕获
    ——>默认操作
    ——>执行信号处理函数

使用signal函数来处理上述过程

  1. 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;
}
	

猜你喜欢

转载自blog.csdn.net/weixin_51911075/article/details/128022926