信号的使用

  • 信号:操作系统预先定义好的某些特定事件的集合,信号可以被产生,也可以被接收
  • 信号响应方式:默认 SIG_DFL        忽略 SIG_IGN        自定义

自定义修改信号的相应方式:

    typedef void (*Fun)(int);
    Fun signal(int signum,Fun fun);//signum:信号类型,信号值

用kill -l查看系统定义的信号列表
在这里插入图片描述
我们可以观察到:每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定义#define SIGINT 2,Ctrl-C产生的信号只能发给前台进程 。
注:1至31号信号,是非实时信号,发送的信号可能会丢失,不支持信号排队。如果连续收n个相同的信号,接收信号的进程会将所有的信号合并成一个信号!
编号34以上的是实时信号,支持信号排队,发送的多个实时信号都会被接收.
在Linux中键入 vim /usr/include/bits/signum.h,我们可以看到系统定义的一些信号:
在这里插入图片描述

  • 信号的发送
int kill(pid_t pid,int signum);
//pid_t pid 将信号发送给哪个进程
//发送的信号类型

pid > 0 :指定接收进程的PID
pid = = 0 :将信号发送给当前进程组中所有的进程
pid == -1 :将信号发送给系统上所有的进程(有权限发送)
pid < -1 :将信号发送给进程组ID为-pid组内所有的进程。

  • 两个进程同时给一个进程发送相同的信号、连续两次发送同一个信号给同一个进程时:如果第一个信号正在处理,则第二个信号会等待第一个信号处理完成。

代码实例:进程第一次接收信号打印helloworld,第二次接收结束进程。

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

void fun(int sign)
{
	printf("hello world\n");
	signal(SIGINT,SIG_DFL);
}

int main()
{
	signal(SIGINT,fun);
	while(1)
	{
		sleep(1);
		printf("main running\n");
	}
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值