栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Linux ---信号的使用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux ---信号的使用

文章目录
    • 信号

信号

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

信号的值在系统源码中的定义如下:

#define SIGHUP 1
#define SIGINT 2 //键盘按下 Ctrl+c 时,会产生该信号
#define SIGQUIT 3
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT 6
#define SIGBUS 7
#define SIGFPE 8
#define SIGKILL 9 //该信号的响应方式不允许改变
#define SIGUSR1 10
#define SIGSEGV 11
#define SIGUSR2 12
#define SIGPIPE 13 //读端关闭的描述符,写端写入时产生,该信号会终止程序
#define SIGALRM 14
#define SIGTERM 15 //系统 kill 命令默认发送的信号
#define SIGSTKFLT 16
#define SIGCHLD 17 //子进程结束后,会默认给父进程发送该信号
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23

2、修改信号的响应方式 – signal()

typedef void (*sighandler_t)(int);

sighandler_t signal(int sig,sighandle_t sig_fun);

忽略:  SIG_IGN
默认:  SIG_DFL
自定义:自己写的信号处理函数

示例:自定义信号处理函数如下所示

#include 
#include
#include

void fun_sig(int sig)
{
	printf("sig = %dn",sig);
	}
	int main()
	{
	sighal(SIGINT,fun_sig); //回调函数  由内核调用,当内核收到信号后调用
	while(1)
	{
	printf("mai runn");
	sleep(1);
	}

忽略SIGINT信号

signal(SIGINT,SIG_IGN);

在键盘上按下 Ctrl+c 时,会给当前终端前台执行的进程发送 SIGINT 信号,用 signal 修
改 SIGINT 信号的响应方式示例代码如下:

#include
#include
#include
#include
#include
#include 

void fun(int sign)
 {
 printf("fun was called, sign = %dn", sign);
 }

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

 exit(0);
 }

注:
信号可以重复多次响应,当一个信号执行后会覆盖前面的信号

主程序接受到信号后会,内核去调用回调函数去处理函数,主函数程序将会暂停,当内核调用的回调函数执行完后,才会恢复主函数的运行

3、发送信号 – kill()
kill() 可以向指定的进程发送指定的信号:
int kill(pid_t pid, int sig);
pid > 0 指定将信号发送个那个进程
pid == 0 信号被发送到和当前进程在同一个进程组的进程
pid == -1 将信号发送给系统上有权限发送的所有的进程
pid < -1 将信号发送给进程组 id 等于 pid 绝对值,并且有权限发送的所有的进程。
sig 指定发送信号的类型。
使用 kill()系统调用实现类似于系统 kill 命令的程序如下

int main()
{
if(argc!=2)
{
printf("arg errn")
exit(1);
if(kill() == -1)
{
perror("kill err");
}
exit(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");
 }
exit(0);
}

信号的实现:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931889.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号