Linux信号的使用

本文介绍了信号的基本概念,如信号作为系统响应事件的机制,以及常用信号值及其功能。通过信号系统调用和自定义信号处理函数,探讨如何设置信号响应并举例说明。最后,展示了如何通过编程实践,如使用C语言的signal函数和kill命令,实现信号控制和自定义KILL命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

信号的基本概念

  • 信号是系统相应某个条件而产生的事件,进程接收到信号会执行相应的操作
  • 与信号有关的系统调用在signal.h头文件中有声明
  • 常见信号的值,及对应的功能说明:

在这里插入图片描述

通过对某个进程发送信号来告诉进程某个事件产生了,再由进程处理这个事件(举个例子:比如我们在上课,老师说下课这就是一个信号,然后我们都收拾东西开始回家这就属于对事件的处理)

再举个例子,比如我们现在运行一个sleep 300,然后我们ctrl + c,这个过程就是sleep进程收到我们的结束进程的信号,然后进行结束进程
在这里插入图片描述
进程可以通过获得内核或者其他进程的发送信号,然后来进行相应,并且可以通过设置相应的方式
在这里插入图片描述

信号的使用

  • 设置信号的相应方式signal()
  1. 默认 SIG_DFL
  2. 忽略 SIG_IGN
  3. 自定义:void fun_sig(int sig)

我们通过帮助手册查看signal方法
在这里插入图片描述

写一段代码来看看

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<signal.h>

void sig_fun(int sig)
{
	printf("sig=%d\n",sig);
}
int main()
{
	//SIGINT 就是 ctrl + c,假如收到SIGINT信号,就去调用这个函数
	signal(SIGINT,sig_fun);
	while(1)
	{
		printf("main run\n");
		sleep(1);
	}
}

在这里插入图片描述
当我们输入SIGINT信号,内核就会去调用我们设置的方法

通过信号实现自己的KILL命令

在这里插入图片描述
查看帮助手册,我们是通过系统调用来实现

我们先看一下系统命令kill的使用,我们通过kill命令来杀死创建的一个sleep进程,这里使用kill默认传送15号信号
在这里插入图片描述
假如这个sleep被暂停挂起(对15号信号忽略),通过kill pid就不能终止,需要加上参数-9传送9号信号来进行杀死,9号信号不会被进程忽略,让管理员再任意情况都能进行进程终止

#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<signal.h>

int main(int argc,char* argv[])//会传入参数
{
	if(argc != 3 )// 1../mykill  2. pid   3. 信号 sig 
	{
		printf("argc errno\n");//如果参数不正确
		return 0;
	}
	int pid = 0;
	int sig = 0;
	sscanf(argv[1],"%d",&pid);//通过已有的参数,当作从键盘获得数据进行给予
	sscanf(argv[2],"%d",&sig);

	if(kill(pid,sig) == -1 )
	{
		perror("kill error");//kill失败
	}
	exit(0);
}

执行成功
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值