Linux信号通信

信号是在软件测上对中断机制的一种模拟是一种异步通信方式,信号可以直接进行用户空闲进程和内核进程之间的交互,内核进程也可以利用他来通知用户控件进程发生了哪些系统事件。如果该进程当前未处于执行态,则该信号由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延时,直到其阻塞被取消时才被传递给进程
信号的生存周期:
由内核产生,将信号发送给用户进程,用户进程进行信号注册(signal将信号和执行方式关联起来)->信号处理->信号注销
信号的处理方式
忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL和SIGSTOP
捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数
执行缺省操作:linux对每种信号都规定了默认操作
信号处理流程
Linux信号通信_第1张图片

使用信号的场合
后台进程需要使用信号
两个进程之间没有亲缘关系,无法使用无名管道
如果两个通信进程之一只能使用标准输入和标准输出,则无法使用FIFO
信号的发送和捕捉
Kill():
函数原型:int kill(pid_t pid, int sig)
其中 pid=正数:要接受信号量的进程的进程号
Pid=0: 信号量被发送到所有和pid进程在同一进程组的进程
Pid=1: 信号发送给所有进程表中的进程(进程号最大的除外:1)
raise()允许进程给自己发送信号
Alarm():闹钟函数,当定时时间到了内核向进程发送SIGALARM信号
函数原型:unsigned int alarm(unsigned int second)
其中 返回值:如果之前已经设置了,而返回剩余时间,但是此时时间会被从新 设定。如果之前没有设置则返回0,失败返回-1
Pause():函数是用于将调用进程挂起直到收到信号(所有信号都可以)为止
信号处理的方法:
Signal():信号注册,指定要处理的信号和处理方法
原型:sighandler_t signal(int signum,sighandler_t handler)
Typedef void (*sighandler_t)(int)
其中:handler=SIG_IGN:忽略该信号
handler=SIG_DFL:采用系统默认方式处理该信号
handler=自定义处理函数指针:回调函数

signal使用
#include 
#include 
#include 
#include 

Void handler(int signum)
{
	printf(“signum:%d”,sighnum);
}

Int main()
{
	signal(SIGINT,SIG_IGN);//注册(忽略Ctrl+Z)
	Signal(SIGQUIT,handler);//Ctrl+\调用自定义处理函数
	
	While(1)
	{
		printf(“PID:%d   PPID:%d”,getpid(),getppid());
		sleep(1);
	}
}

你可能感兴趣的:(Linux)