多进程间通信学习之信号通信-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
  • 进程对信号的处理方式
  • 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不能被忽略和捕捉
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6