Linux进程间通信——信号通信

一、基本概念

1、中断:
	在程序执行过程中,插入了另一段程序的执行过程。该段程序执行结束后回到中断点继续执行原来的程序。

2、同步通信与异步通信:
同步通信:发送方发送数据,接收方接收数据,双方在很短的时间内完成数据的交换,否则会造成一方的阻塞。所以
		 同步通信是一种阻塞模式的通信。
异步通信:通信中接收方并不知道数据什么时候会到达,当前进程一直准备接收数据,同时也在做自己的事情,一旦
		 数据到达立即接收处理。

3、信号是一种异步通信方式,信号是在软件层次上对中断机制的一种模拟。同时,信号是进程间通信机制中唯一
   的异步通信机制。


	在Linux系统下可以通过:“kill -l”命令来查看系统的64中信号,每种信号都有自己的宏定义,常见的几种
信号有如下几种:
信号名定义默认操作
SIGINT该信号中用户输入INTR字符(CTRL + C )时发出,终端驱动程序发送此信号并送到前台进程的每一个进程终止进程
SIGKILL该信号用来立即结束程序的运行,并且不能被阻塞和忽略终止进程
SIGALARM当一个定时器到时的时候发出该信号终止进程
SIGSTOP该信号用于暂停一个进程,且不能被阻塞、忽略或处理暂停进程
SIGTSTP该信号用于交互停止进程,用户输入SUSP字符(通常是CTRL + Z)时发出该信号停止进程
SIGCHLD子进程状态发生改变时,父进程会受到这个信号忽略

在这里插入图片描述

二、Linux下信号的处理方式

	在Linux系统下当进程收到一个信号后,它有三种方式对信号进行相应。
1、忽略信号:
	即对信号不做任何处理,其中有两个信号不能进行忽略:SIGKILL及SIGSTOP。对信号进行忽略处理需要调用
signal或者sigaction函数,对指定信号进行SID_IGN设置,表示忽略指定的信号。
	以这种方式对信号进行忽略处理即告知操作系统,当进程接收到指定的信号时操作系统不用告知我,操作系统
直接处理就好,进程本身不关心这种信号。

2、捕捉信号:
	定义相应的信号处理函数,如果某种信号发生,执行指定操作。信号的处理函数和信号的捕捉需要通过signal
函数进行关联,即当捕捉到某种信号后去执行相应的信号处理函数。

3、执行默认操作:
	当某种信号发生时,操作系统已默认缺省的方式进行处理。

三、信号的发送与设置

1、定时器信号

1、alarm函数:
函数原型:unsigned int alarm(unsigned int seconds);
函数参数:seconds		指定秒数,系统经过seconds秒后向该进程发送SIGALRM信号。如果seconds == 0,
						表示取消当前的定时器。
返回值:>=0	如果调用此alarm之前,进程中已经设置了闹钟时间,则返回上一个闹钟剩余的时间;否则,返回0
	    =-1	出错。
说明:alarm也称为闹钟函数,它可以在进程中设置一个定时器。当定时器指定的时间到了之后,它就向进程发送
	 一个SIGALRM信号。需要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm函数之前已经设置过闹
	 钟时间,则任何以前的闹钟时间都会被代替。


2、pause函数
函数原型:int pause(void);
函数功能:它用于把一个进程挂起,直到接收到信号为止。
返回值:-1,并且把errno设置为EINTR。

在这里插入图片描述

2、信号的处理、设置

1、signal函数:
函数原型:typedef void (*sighandler_t)(int);//函数指针
		 sighandler_t signal(int signum, sighandler_t handler);
函数参数:signum		指定信号对应的代码数字或者宏定义。
		 handler	SIG_IGN,忽略该信号
		 			SIG_DFL,采用系统默认方式处理信号
		 			自定义的信号处理函数
说明:
1、signal函数并不是发送信号,只是将信号与相关的信号处理函数进行关联。
2、信号通信是异步通信,只要在当前进程没有接收到信号并进行默认处理之前,都可以调用signale函数来对信号
进行捕捉处理。

在这里插入图片描述

3、信号的发送

1、kill函数:
函数原型:int kill(pid_t pid, int sig);
函数参数:pid	>0,发送信号给进程号为pid的进程
		 		==0,信号被发送给所有和当前进程在同一进程组的每一个进程。
		 		<-1,信号发送给进程组好为-pid的每一个进程
		 sig	信号的类型,Linux下64中信号类型都有其对应的宏定义。
返回值:成功,返回0;失败,返回-1。
说明:kill函数和kill命令一样,可以发送信号给进程或进程组。需要注意的是,它不仅可以终止进程(SIGTERM),
	 还可以向进程发送其它信号。

kill命令:kill -signal pid;    <==>    killall -signal 可执行程序
		 signal表示相应的信号对应的数字,或则是宏定义。


2、raise函数:
函数原型:int raise(int sig);
函数参数:sig	信号类型
返回值:成功,返回0;失败,返回-1。
说明:raise函数也可以用来发送信号,但是它与kill函数的区别在于:raise函数只允许向自身进程发送信号。

在这里插入图片描述

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值