linux信号通信

1.信号是unix系统中最基础的进程间通信机制,有以下情况可以产生信号:

1.1.当用户按某些按键时产生信号;

1.2.硬件异常产生信号(除数为零,无效的存储访问等等);

1.3.进程用kill函数将信号发送给另一个进程

1.4.用户用kill命令将信号发送给其他进程


2.常见信号类型:

SIGHUP:从终端上发出的结束信号

SIGINT:来自键盘的中断信号(Ctrl-C)

SIGKILL:结束接收信号的进程

SIGTERM:kill命令发出的信号

SIGCHLD:标识子进程停止或结束的信号

SIGSTOP:来自键盘或调试程序的停止信号(Ctrl-Z)


3.信号发送

3.1kill函数:

#include<sys/types.h>
#include<signal.h>
int kill(pid_t pid,int signum)
可以向进程自身发送信号,也可以向其他进程发送信号。

pid>0,将信号发送给进程ID为pid的进程;pid==0,将信号发送给同组进程;pid<0,将信号发送给进程组id等于pid绝对值的进程;pid==-1,将信号发送给所有进程。


3.2raise函数

#include<sys/types.h>
#include<signal.h>
int raise(int signum)
只能向进程自身发送信号


3.3alarm函数

#include<unistd.h>
unsigned int alarm(unsigned int seconds)
设置一个时间值seconds,当经过seconds秒后,产生SIGALARM信号,如果不捕捉此信号,系统默认结束该进程。每个进程只能有一个alarm时间,新的alarm时间将更新旧的alarm时间;当seconds被设置为0,表示关闭alarm操作。


3.4pause函数

#include<unistd.h>
int pause(void)
使调用的进程挂起直至捕捉到一个信号。




4.信号处理

4.1忽略信号:大多数信号都按这种方式进行处理,但SIGKILL和SIGSTOP不能被忽略。

4.2执行用户希望的动作:通知内核在某种信号发生时调用一个用户函数。

4.3执行系统默认的操作:对大多数信号的系统默认操作时终止该进程。

信号处理的主要方法有两种,一种使用signal函数,一种使用信号集函数组。


4.4signal函数

#include<signal.h>
void (*signal(int signum,void(*func)(int)))(int)
==>>

typedef void (*sighandler_t)(int) //函数指针
sighandler_t signal(int signum,sighandler_t handler)
func可以是:

SIG_IGN:忽略此信号

SIG_DFL:使用系统默认方式

信号处理函数名:使用该函数(handler)处理,如下:

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

/*自定义信号处理函数*/
void my_func(int sign_no)
{
	if(sign_no==SIGBUS)
		printf("I have get SIGBUS\n");
}
int main()
{
	printf("Waiting for signal SIGBUS \n ");
	
	/*注册信号处理函数*/
	signal(SIGBUS,my_func);
	
	pause();//将进程挂起直到捕捉到信号为止
	exit(0);
}









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值