Linux基本信号的使用
一、信号的基本概念
1.基本信号对应的响应
信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。
与信号有关的系统调用在“signal.h”头文件中有声明
常见信号的值,及对应的功能说明:
2.信号的值在系统源码中的宏定义
#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
二、信号响应方式的修改-signal()
1.signal()函数
sighandler_t是函数指针,函数原型为 void fun(int)
signum是信号值
sighandler_t signal(int signum, sighandler_t handler)就是当signum信号产生时,响应方式为回调函数handler的动作。
回调函数SIG_IGN是忽略信号,即不作任何响应,SIG_DFL是信号的响应方式为默认方式。
2.signal()函数的使用
我们长使用的Ctral+c就是触发了信号SIGINT(值为2),比如我们想要修改Ctral+c信号的响应方式:
1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 #include<signal.h>5 6 void fun(int sig)//该函数的动作即为信号修改后的响应方式7 {8 printf("这是信号SIGINT(%d)的相应方式\n", sig);9 }10 11 int main()12 {13 signal(SIGINT, fun);//将Ctral+c(信号SIGINT)响应方式修改为回调函数fun的动作14 while(1)15 {16 printf("main run\n");17 sleep(1);18 }19 return 0;20 }
运行结果:
可以修改其他信号的相应方式,只需要将signal中的第一个参数信号SIGINT修改为其他信号就可以了。
如果想要第一次修改Ctral+C的响应方式,第二次让它默认响应方式响应呢?上面说了SIG_DFL可以使信号的响应方式回复默认方式。
代码:
#include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 #include<signal.h>5 6 void fun(int sig)7 {8 printf("这是信号SIGINT(%d)的相应方式\n", sig);9 signal(SIGINT, SIG_DFL);//将Ctral+C(信号SIGINT)的响应方式改为默认方式10 }11 12 int main()13 {14 signal(SIGINT, fun);//将Ctral+C(信号SIGINT)响应方式改为回调函数fun的动作15 while(1)16 {17 printf("main run\n");18 sleep(1);19 }20 return 0;21 }
~
运行结果:
三、发送信号-kill()
1.kill函数原型![](/assets/blank.gif)
成功返回0,失败返回-1.
参数pid是进程id, sig是信号,即给进程id为id的进程发送信号sig。
pid > 0 指定将信号发送个那个进程
pid == 0 信号被发送到和当前进程在同一个进程组的进程
pid == -1 将信号发送给系统上有权限发送的所有的进程
pid < -1 将信号发送给进程组 id 等于 pid 绝对值,并且有权限发送的所有的进程。
sig 指定发送信号的类型。
2.kill函数的使用
#include <stdio.h>2 #include <stdlib.h>3 #include <unistd.h>4 #include <signal.h>5 6 int main(int argn, char* argv[])7 {8 if(argn != 3)9 {10 printf("argc error\n");11 exit(0);12 }13 14 int pid = 0;15 int sig = 0;16 sscanf(argv[1],"%d",&pid);17 sscanf(argv[2],"%d",&sig);18 19 if(kill(pid,sig) == -1)20 {21 perror("kill error");22 }23 exit(0);24 }
下面运行一个程序,用自己写的kill命令结束其运行:
用自己的kill可执行文件向signal_SIGINT程序发送9号命令,将其杀死。
Linux基本信号的使用相关推荐
- linux kill信号列表
linux kill信号列表 $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6 ...
- linux多线程信号总结
linux多线程信号总结-businiaowyf-ChinaUnix博客 linux 多线程信号处理总结 - CobbLiu - 博客园
- linux python 信号,Python模块之信号(signal)
在了解了Linux的信号基础之 后,Python标准库中的signal包就很容易学习和理解.signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时 ...
- linux 查看进程的信号,Linux 进程信号查看与控制
Linux 进程信号查看与控制 1) SIGHUP 本信号在用户终端连接 (正常或非正常) 结束时发出 通常是在终端的控制进程结束时 通知同一 session 内的各个作业 这时它们与控制终端不再关联 ...
- Linux进程间通信——信号
一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...
- Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号
首先区分一下Linux信号跟进程间通信中的信号量,它们的关系就犹如老婆跟老婆饼一样,没有一毛钱的关系. 信号的概念 信号的概念:信号是进程之间事件异步通知的一种方式,属于软中断.比如:红绿灯是一种信号 ...
- Linux Signal信号详解
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全 ...
- linux. qt信号崩溃,【创龙AM4379 Cortex-A9试用体验】之I/O中断异步通知驱动程序+QT捕获Linux系统信号+测试信号通知...
2.驱动程序 安装字符设备驱动程序开发流程开发. 2.1资源定义 定义按键I/O端口号.I/O中断号,以及字符设备的主设备号变量: #define GPIO_KEY1_PIN_NUM (3*32 + ...
- Linux系统信号定义
Linux系统信号,即signal,定义通常在这个头文件中: /usr/include/asm-generic/signal.h 常见的信号如下: #define SIGHUP 1 # ...
- linux操作系统---信号
linux操作系统---信号 信号 定义 信号的响应方式 修改信号的响应方式 注意事项 练习 信号的发送 练习 信号 定义 系统预先定义好的某些特定的事件,信号可以被发送,也可以被接受,发送和接受的主 ...
最新文章
- mysql视图登录_mysql视图
- Android OkHttp的使用心得
- ubuntu 安装spark
- 「后端小伙伴来学前端了」Vue-Router 路由各种跳转、传参、小知识
- RocketMQ部署安装注意事项
- vim程序编译器使用(整理)
- ubuntu20.04安装kylin的wineQQ+qq群聊看不见图片的问题
- 前端学习(2962):前一天回顾
- python获取eth0_详解 Python 获取网卡 IP 地址的黑魔法
- 调整Word中英文与汉字之间的空隙
- utf8编码在线转换html,utf8 gb2312编码在线转换工具
- 计算机分盘介质受写入保护,硬盘介质受写入保护怎么处理
- 【滤波】一维卡尔曼滤波器
- 【​观察】纺织印花行业转型与升级提速 爱普生蒙娜丽莎掀起技术迭代革命...
- 蛋蛋弹车2-具有功能安全EPS系统设计(工具篇2)
- 全自动采集小说模板源码+送7条可用7大采集规则
- 简洁但功能强大的EditPlus
- 个人笔记 springboot整合shiro实现权限管理,前端使用vue 10155
- Android N App分屏模式完全解析(上)
- 哈夫曼树:HDU5884-Sort(队列、哈夫曼树)
热门文章
- Git入门之上传本地项目至Github(一)
- C经典面试题之深入解析 字符串拷贝的 sprintf、strcpy和memcpy使用与区别
- HarmonyOS之基础环境和应用开发流程
- 2013\Province_Java_A\2.振兴中华
- 1371. Find the Longest Substring Containing Vowels in Even Counts
- PAT (Basic Level) Practice (中文)1007 素数对猜想 (20 分)
- Linux(五) 权限
- 【POJ 3274】Gold Balanced Lineup (stl map )设计hash表,处理碰撞
- 每天一道LeetCode-----合并两个/多个有序链表为一个新链表
- hadoop(3)——yarn查看方式