一、信号的基本概念

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函数原型

成功返回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基本信号的使用相关推荐

  1. linux kill信号列表

    linux kill信号列表 $ kill -l 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL 5) SIGTRAP      6 ...

  2. linux多线程信号总结

    linux多线程信号总结-businiaowyf-ChinaUnix博客 linux 多线程信号处理总结 - CobbLiu - 博客园

  3. linux python 信号,Python模块之信号(signal)

    在了解了Linux的信号基础之 后,Python标准库中的signal包就很容易学习和理解.signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时 ...

  4. linux 查看进程的信号,Linux 进程信号查看与控制

    Linux 进程信号查看与控制 1) SIGHUP 本信号在用户终端连接 (正常或非正常) 结束时发出 通常是在终端的控制进程结束时 通知同一 session 内的各个作业 这时它们与控制终端不再关联 ...

  5. Linux进程间通信——信号

    一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...

  6. Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号

    首先区分一下Linux信号跟进程间通信中的信号量,它们的关系就犹如老婆跟老婆饼一样,没有一毛钱的关系. 信号的概念 信号的概念:信号是进程之间事件异步通知的一种方式,属于软中断.比如:红绿灯是一种信号 ...

  7. Linux Signal信号详解

    信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全 ...

  8. linux. qt信号崩溃,【创龙AM4379 Cortex-A9试用体验】之I/O中断异步通知驱动程序+QT捕获Linux系统信号+测试信号通知...

    2.驱动程序 安装字符设备驱动程序开发流程开发. 2.1资源定义 定义按键I/O端口号.I/O中断号,以及字符设备的主设备号变量: #define GPIO_KEY1_PIN_NUM (3*32 + ...

  9. Linux系统信号定义

    Linux系统信号,即signal,定义通常在这个头文件中: /usr/include/asm-generic/signal.h 常见的信号如下: #define SIGHUP         1 # ...

  10. linux操作系统---信号

    linux操作系统---信号 信号 定义 信号的响应方式 修改信号的响应方式 注意事项 练习 信号的发送 练习 信号 定义 系统预先定义好的某些特定的事件,信号可以被发送,也可以被接受,发送和接受的主 ...

最新文章

  1. mysql视图登录_mysql视图
  2. Android OkHttp的使用心得
  3. ubuntu 安装spark
  4. 「后端小伙伴来学前端了」Vue-Router 路由各种跳转、传参、小知识
  5. RocketMQ部署安装注意事项
  6. vim程序编译器使用(整理)
  7. ubuntu20.04安装kylin的wineQQ+qq群聊看不见图片的问题
  8. 前端学习(2962):前一天回顾
  9. python获取eth0_详解 Python 获取网卡 IP 地址的黑魔法
  10. 调整Word中英文与汉字之间的空隙
  11. utf8编码在线转换html,utf8 gb2312编码在线转换工具
  12. 计算机分盘介质受写入保护,硬盘介质受写入保护怎么处理
  13. 【滤波】一维卡尔曼滤波器
  14. 【​观察】纺织印花行业转型与升级提速 爱普生蒙娜丽莎掀起技术迭代革命...
  15. 蛋蛋弹车2-具有功能安全EPS系统设计(工具篇2)
  16. 全自动采集小说模板源码+送7条可用7大采集规则
  17. 简洁但功能强大的EditPlus
  18. 个人笔记 springboot整合shiro实现权限管理,前端使用vue 10155
  19. Android N App分屏模式完全解析(上)
  20. 哈夫曼树:HDU5884-Sort(队列、哈夫曼树)

热门文章

  1. Git入门之上传本地项目至Github(一)
  2. C经典面试题之深入解析字符串拷贝的sprintf、strcpy和memcpy使用与区别
  3. HarmonyOS之基础环境和应用开发流程
  4. 2013\Province_Java_A\2.振兴中华
  5. 1371. Find the Longest Substring Containing Vowels in Even Counts
  6. PAT (Basic Level) Practice (中文)1007 素数对猜想 (20 分)
  7. Linux(五) 权限
  8. 【POJ 3274】Gold Balanced Lineup (stl map )设计hash表,处理碰撞
  9. 每天一道LeetCode-----合并两个/多个有序链表为一个新链表
  10. hadoop(3)——yarn查看方式