多进程间通信学习之信号通信

本文详细介绍了进程对信号的四种处理方式,包括忽略、默认、捕捉和发送信号,以及raise、kill、alarm等信号相关函数的作用和用法。特别强调了SIG系列信号的重要性和特性。
摘要由CSDN通过智能技术生成
  • 进程对信号的处理方式:
  • 1、忽略;
  • 2、默认;
  • 3、捕捉;
  • 发送信号的三种情形:
  • 1、操作系统给进程发送信号;
  • 2、用户给进程发送信号;
  • 3、一个进程给另一个进程发送信号;
  • 信号的本质:
  • 1、信号是中断的一种软件模拟;
  • 2、信号是基于操作系统内核实现;
  • 3、而中断则是基于硬件实现;
  • 信号处理函数(signal函数):
	#include <signal.h>
	typedef void (*sighandler_t)(int);//给函数指针起别名
	sighandler_t signal(int signum, sighandler_t handler);
	/*
	功能:
	
		在进程中注册信号处理函数
	
	参数:
		signum:信号的编号(除了 SIGKILL 和 SIGSTOP之外的)
	
		handler:信号处理方式
	
			忽略: SIG_IGN
	
			默认: SIG_DFL
	
			捕捉: 自定义信号处理函数
	
				void sig_func(int signum){
	
					//捕捉到信号后的处理逻辑
	
				}
	返回值:
	
		成功  	返回指向handler的指针
	
		失败 	SIG_ERR  重置错误码
	*/
  • 发送信号的函数(raise函数、kill函数):
  • raise函数:
	#include <signal.h>
	int raise(int sig);
	/*
	功能:
	
		给自己发信号
	
	参数:
	
		信号的编号
	
	返回值:
	
		成功 0  失败 非0
	*/
  • kill函数:
	#include <sys/types.h>
	#include <signal.h>
	int kill(pid_t pid, int sig);
	/*
	功能:
	
		给指定pid的进程发信号
	
	参数:
	    	pid 进程号
	
	        		>0 给指定的pid发信号,常用的用法
	
	        		0  给同组的进程发信号
	
	        		-1 给所有有权限操作的进程发信号,init除外
	
	        		<-1 如-100,给进程组id为100的所有进程发信号
	
	    	sig 信号的编号
	
	返回值:
	
	    	成功 0
	
	    	失败 -1 重置错误码
	 */ 
  • 信号定时器函数(alarm函数):
	#include <unistd.h>
	unsigned int alarm(unsigned int seconds);
	/*
	功能:
	
	    	在指定的秒数到达后,给当前进程发一个SIGALRM信号
	
	    	如果seconds为0 则不发信号
	
	参数:
	
	    	seconds:倒计时的秒数
	
	返回值:
	
	    	如果之前没有调用过alarm 则返回0
	
	    	如果之前调用过alarm 则返回剩余的秒数
	*/
  • 常用的信号:
  • SIGHUP: 该信号在用户终端关闭时产生,通常是发给和该终端关联的会话内的所有的进程;
  • SIGINT:该信号在用户键入INTR字符即Ctrl C时产生,内核发送此信号送到当前终端的所有前台进程;
  • SIGQUIT:该信号和SIGINT类似,但由QUIT字符Ctrl \)来产生;
  • SIGILL:该信号在一个进程企图执行一条非法指令时产生;
  • SIGSEV:该信号在非法访问内存时产生,如野指针、缓存区溢出;
  • SIGPIPE:当进程往一个没有读端的管道中写入时产生,代表管道断裂
  • SIGKILL:该信号用来结束进程,并且不能被捕捉和忽略;
  • SIGSTOP:该信号用来暂停进程,并且不能被捕捉和忽略;
  • SIGTSTP:该信号用于暂停进程,用户可键入SUSP字符Ctrl Z)发出这个信号;
  • SIGCONT:该信号让进程进入运行态
  • SIGALRM:该信号用于通知进程定时器时间已到;
  • SIGCHLD :当子进程退出的时候,会给父进程发送该信号;
  • SIGUSR1、SIGUSR2:该信号保留给用户程序使用;
  • 注意:
  • 只有SIGKILLSIGSTOP不能被忽略和捕捉;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值