操作系统中信号的基本操作

一、基本概念

1、中断
	中止(暂停)当前正在执行的任务,转而执行其他任务,这种行为叫中断。
	硬件中断:来自硬件的中断。
	软件中断:来子软件的中断。
2、信号是一种软件中断
	它为进程异步执行任务提供了一种机制。
	 1) SIGHUP	 		2) SIGINT	 	3) SIGQUIT	 	4) SIGILL	 	5) SIGTRAP
	 6) SIGABRT	 		7) SIGBUS	 	8) SIGFPE	 	9) SIGKILL		10) SIGUSR1
	 11) SIGSEGV		12) SIGUSR2		13) SIGPIPE		14) SIGALRM		15) SIGTERM
	 16) SIGSTKFLT		17) SIGCHLD		18) SIGCONT		19) SIGSTOP		20) SIGTSTP
	 21) SIGTTIN		22) SIGTTOU		23) SIGURG		24) SIGXCPU		25) SIGXFSZ
	 26) SIGVTALRM		27) SIGPROF		28) SIGWINCH	29) SIGIO		30) SIGPWR
	 31) SIGSYS	    	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
	 38) SIGRTMIN+4		39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
	 43) SIGRTMIN+9		44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
	 48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
	 53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
	 58) SIGRTMAX-6	    59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
	 63) SIGRTMAX-1	    64) SIGRTMAX
3、常见的信号
	SIGINT 终端中断符信号 Ctrl+c 发出
	SIGQUIT 终端退出符型号 Ctrl+ \ 发出
	SIGFPE  算术异常信号 程序执行的除0操作
	SIGSEGV 段错误停下 非法使用了内存
	SIGSTOP 暂停信号 不能被捕获或忽略,收到SIGCONT信号才能继续
	SIGCONT 继续信号 不能被捕获或忽略,可以让停止的进程运行。
4、不可靠信号
	kill -l可以显示出所有可用的信号。
	1到31 是建立在早期的机制上的,不支持排队,同一个信号产生多次,只处理一次(单位时间内处理一次),这种机制可能会导致信号丢失。

5、可靠信号(两种信号相互独立,互不干扰)
	34到64 是建立在新机制的信号,支持排队,不会丢失。
6、信号的处理
	1、忽略
	2、终止
	3、终止+core(记录着内存的使用情况)(~/.bashrc可以记录在环境中)
		第一步,执行:ulimit -c unlimited ,使用系统弄够生成core文件。
		第二部:gcc -g code.c  加入调试信息
		第三步:重新执行程序,生成带调试信息的core文件
		第四步:使用gdb a.out core 文件进行调试。
		第五步: where 显示在什么位置什么原因产生的错误。
	4、捕获并处理,当信号发生时,操作系统会调用一个预先注册好的一个处理函数。

二、信号的捕获

	#include <signal.h>

   typedef void (*sighandler_t)(int);//信号处理函数的格式

   sighandler_t signal(int signum, sighandler_t handler);
	功能:向内核注册一个信号处理函数
	signum:要捕获并处理的型号
	han-dler:当信号发生时要执行的函数
	注意:这个步骤一般写在程序的开始部分,或者项目初始化阶段。

	代码产生(除0、非法使用内存)的信号,这种信号也能被捕获,但是当信号处理完后,
	又会回到产生错误的位置,如果这个错误没有消除又会继续产生信号,会形成死循环,解决方法:
		1、在信号处理函数中把错误消除掉
		2、把数据保存,然后安全退出。exit(1)函数,无论在哪都可以直接退出。

三、发送信号

1、键盘发送信号
	Ctrl+c SIGINT
	Ctrl+\ SIGQUIT
	Ctrl+z SIGSTOP
2、错误产生信号
	除0操作 SIGFPE
	非法访问内存 SIGSEGV
	硬件故障 SIGBUS  (内存烧了,U盘退出)
3、命令发送信号
	#include <sys/types.h>
   	#include <unistd.h>

  	 pid_t getpid(void);
   	pid_t getppid(void);
	功能:获取进程号;
	返回值:当前进程的进程号

	kill -sig(信号编号) 进程号。
	ps -aux (可以看进程号)。
	kill all 程序名 向所有叫这个名字的进程发送信号。
4、函数发送信号
	#include <sys/types.h>
	#include <signal.h>
	
	int kill(pid_t pid, int sig);
	功能:向指定的进程发送信号
	pid:
		pid > 0 向指定的进程发送信号
		pid = 0 向同组的进程发送信号
		pid = -1 向所有进程发送信号(以权限作为范围)。
		(root 用户可以向所有的进程发送信号,普通用户只能对自己的进程发送信号)
		pid < -1 向进程号等于pid绝对值的进程发送信号。
	sig:信号的编号
		如果sig的值不存在,不会发送,但也不会返回错误。
		当发送的进程不存在时,才会返回错误,这个功能可以用来检查一个进程是否存在。
	返回值:一般0表示成功,负数表示失败。
	
	#include <signal.h>

    int raise(int sig);
	功能:向当前进程发送信号。(向自己发送信号)
	返回值:成功返回 0 ,失败返回-1(内核出问题)(如果信号不存在也能发送,也算成功,返回值为0);

在这里插入图片描述
常用的信号

猜你喜欢

转载自blog.csdn.net/weixin_43716607/article/details/86133404
今日推荐