linux自定义信号,并kill测试

2023-10-26

1. 自定义信号的说明

有时候我们需要在程序中利用信号来控制程序行为,linux为我们提供了2个已经定义的信号SIGUSR1和SIGUSR2,一般的程序利用这2个信号已经能满足需要,不过我最近需要一些其他信号来避免覆盖原来的信号处理函数。
    上网查了一下,看到了下面的程序片段:  
1
2
#define MYSIG_MSG        (SIGUSR2 + 1)
<p> // 定义信号然后注册处理函数</p>

   
    然后到系统里查了一下,MYSIG_MSG其实将其他的信号给覆盖了:
$kill -l 显示 10) SIGUSR1    11) SIGSEGV    12) SIGUSR2 13) SIGPIPE    14) SIGALRM
    虽然SIGPIPE和SIGALRM在这个程序中没有用到,但是这并不是我想要的效果。
    我发现在后面有 34) SIGRTMIN 35) SIGRTMIN+1    36) SIGRTMIN+2 ,man 7 signal页面同样也说明可以用 SIGRTMIN作为自定义信号。然后程序里就多了下面的代码: 

1
#define MYSIG_MSG        (SIGRTMIN+ 1)


    结果当然是出错了咯,但是并不是这个定义方式的问题。在我程序中有下面的代码:


1
2
3
4
switch (signo){
     case MYSIG_MSG:
     break ;
}

    
    编译时才发现原来SIGRTMIN并不是一个常量,看了头文件里才知道:

1
2
// centos5.9 /usr/include/bits/signum.h
#define SIGRTMIN        (__libc_current_sigrtmin ())


    原来是函数调用,运行时确定的。
    要用这个SIGRTMIN宏是不行,只能自己定义了:

1
2
#define MYSIGRTMIN    34
#define MYSIG_MSG      (MYSIGRTMIN + 1)


    在找到系统定义的SIGRTMIN值之前,根据man 7 signal里面的说明:
    Linux supports 32 real-time signals, numbered from 32 (SIGRTMIN) to 63 (SIGRTMAX).
    我把自定义的信号值定义成了32,但是一直注册不了这个信号,后来赫然发现在 man 7 signal下面有一行说明,
    However, the glibc POSIX threads implementation internally uses two (for NPTL) or three  (for  LinuxThreads)  real-time signals  (see  pthreads(7)), and adjusts the value of SIGRTMIN suitably (to 34 or 35)
    这个说明在ubuntu12.04里面看见的,估计centos也有类似的情况。同时头文件下面也有:

1
2
3
4
/* These are the hard limits of the kernel.  These values should not be
used directly at user level.  */
#define __SIGRTMIN  32
#define __SIGRTMAX  (_NSIG - 1)

    改成34之后就没有问题了。虽然在man里面说明了程序不应该直接用常量标识信号,不过为了达到我的目的也顾不了了。

总结:

__SIGRTMIN基础上的前3个最好不要用,它是linuxthread用的


Sample:

//自定义信号
#define SIG_MY_DEFINE_TEST    __SIGRTMIN+10


2. 编程例子

#include <sys/wait.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>

#include <signal.h>


//自定义信号
#define SIG_MY_DEFINE_TEST    __SIGRTMIN+10

void    sigactionProcess(int nsig)
{
	//================================================================
	//TODO:ADD YOU CODE

	printf("son process sigactionProcess end !pid is:%d\n", getpid()) ;
	//================================================================
	exit(0);
}
//信号处理函数注册
void    sigactionReg(void)
{
	struct sigaction act,oldact;

	act.sa_handler  = sigactionProcess;
	act.sa_flags = 0;

	//sigaction(SIGINT,&act,&oldact);
	sigaction(SIG_MY_DEFINE_TEST,&act,&oldact);
}



int main()
{
  int ret ;
  pid_t pid;/*pid 进程id号*/

  pid=fork();/*创建一个新进程*/

  if(pid==0) /*返回0为子进程*/
  {
      printf("son get Return pid is %d\n",pid);
      printf("This is son process!  pid is:%d\n",getpid());
      //信号处理函数注册
      sigactionReg();
      //raise(SIGSTOP) ;//子进程暂停
      while(1){}
      printf("son process end !pid is:%d\n", getpid()) ;
      exit(0) ;
  }
  else if(pid>0)/*返回大于0为父进程*/
  {
	  printf("parent get Return pid is %d\n",pid);
      printf("This is parent process!  pid is:%d\n",getpid());
      //
	  usleep(1000*10);
	    //获取到pid子进程没有退出,指定WNOHANG不会阻塞,没有退出会返回0
      if ((waitpid(pid, NULL, WNOHANG)) == 0)
      {
          //if ((ret = kill(pid, SIGINT)) == 0)//向子进程发出SIGKILL信号
          if ((ret = kill(pid, SIG_MY_DEFINE_TEST)) == 0)//向子进程发出SIG_MY_DEFINE_TEST信号
          {
               printf("parent kill %d\n", pid) ;
          }
      }
      waitpid(pid,NULL,0);/*等待子进程退出*/
      exit(0) ;
  }
  else
  {
       perror("fork() error!");
       exit(-1) ;
  }
}

测试

parent get Return pid is 10990
This is parent process!  pid is:10986
son get Return pid is 0
This is son process!  pid is:10990
parent kill 10990
son process sigactionProcess end !pid is:10990






参考:

   Linux下发送自定义信号 C++代码
   http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=989499
   
   [转]linux 自定义信号(1)
   http://m.blog.csdn.net/blog/jmflovezlf/18217213
   
       linux自定义信号的处理
       http://my.oschina.net/u/566882/blog/174414
       
        linux进程通信---几个发送信号的函数(kill,raise,alarm,pause)
        http://blog.csdn.net/zzyoucan/article/details/9235685           
       
        Linux进程 Fork函数
        http://1793109.blog.51cto.com/1783109/593183  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux自定义信号,并kill测试 的相关文章

  • Java-网络原理

    目录 一 网络互连 局域网LAN 广域网WAN 二 网络通信基础 IP地址 端口号 认识协议 三 五元组 四 协议分层 五 OSI七层模型 六 TCP IP五层 或四层 模型 网络分层对应 七 封装和分用 一 网络互连 随着时代的发展 越来
  • (超详细!)【C语言】单链表的增删查改(附图解,源码)

    单链表学习导航 一 前言 二 准备工作 1 对单链表运行原理的简单理解 2 区域化编辑 三 SList h头文件引用区 1 单链表节点的创建 2 单链表功能函数的声明 四 SListTest c测试区 五 SList c功能实现区 1 动态
  • Python类型强制转换和字符串的操作

    Python类型强制转换和字符串的操作 类型强制转换 字符串的操作 name I Love The World The Dog print name 0 下标取值 print len name 字符串长度 print name 2 倒数第二
  • 自定义属性

    TypeArray 用来简化资源类型判断 declare styleable 用来生成资源 ID 数组和对应的索引值 自定义属性的声明文件 values attrs xml
  • Eclipse SpringBoot jsp打包部署

    第一步 导入jar包依赖 a 打包方式设置为war b spring boot starter web内嵌tomcat c servlet api支持必须要 第二步 编写tom启动方式 把springBoot默认启动方式交给tomcat方式
  • AsyncTask使用总结

    概述 AsyncTask是由Android封装的一个轻量级异步抽象类 可以在线程池中执行后台任务 然后把执行的进度和最终结果传递给主线程并在主线程中更新UI AsynTask的源码如下 public abstract class Async
  • 纯C语言实现数据结构顺序表

    文章目录 一 顺序表的概念及结构 二 顺序表的实现 1 顺序表的创建 2 顺序表初始化 3 顺序表销毁 4 顺序表打印 5 检查空间 如果满了 进行增容 6 尾部插入一个数据 7 头部插入一个数据 8 尾部删除一个数据 9 头部删除一个数据
  • Python+selenium爬虫启用chrome无头浏览器

    因为使用Selenium执行爬虫任务时 必须要启动浏览器 浏览器的启动与关闭必然会影响执行效率 并且会干扰到其它操作 本机运行时 所以采用Chrome 浏览器的headless Browser模式完美解决该问题 Headless模式 Hea
  • 【从零开始的Java开发】1-5-2 包装类与基本数据类型、常用API、基本数据类型与包装类、字符串之间的转换、包装类的初始值与比较、对象常量池

    文章目录 包装类与基本数据类型 包装类常用方法 基本数据类型与包装类之间的转换 基本数据类型和字符串之间的转换 包装类相关知识 包装类的初始值 包装类对象间的比较 对象常量池 总结 包装类与基本数据类型 Java的数据类型 其中 基本数据类
  • 7-7 长方形 (20 分)

    7 7 长方形 20 分 小明今天学习了长方形 小明想知道用一根长度为n的绳子 可以围成多少种长宽不等 非正方形 的长方形 要求长方形的边长均为整数 输入格式 在一行中给出1个n 表示绳子的长度 输出格式 输出一个正整数表示不同长方形的数量
  • 【转】虚拟机网络服务启动失败Failed to start LSB 解决方法

    场景 克隆了一个虚拟机后不能重启它的网络服务编辑IP配置文件 vi etc sysconfig network scripts ifcfg ens33重新修改了ip后 发现还是报错如下 错误信息 Failed to start LSB 网络
  • java中根据某一属性比较两个list集合是否相同

    创建两个示例列表 List
  • 二叉树前中后序遍历非递归实现

    前序遍历 public static void prifixOrder TreeNode root System out print 前序遍历 Stack
  • XSS-9注入靶场闯关(小游戏)——第九关

    1 这个关卡与第八关相同 直接把编码放上去尝试 之前的payload也无法使用 106 97 118 97 115 99 114 105 112 116 58 97 108 101 114 116 40 49 41 2 输入一个正常连接查看
  • Subscriber class .NewsFragment and its super classes have no public methods

    使用EventButs3 0 0 出现以下错误 Caused by de greenrobot event EventBusException Subscriber class com gozap beacontower ui NewsFr
  • 【C++初阶】简析拷贝构造、赋值运算符重载

    hello 各位读者大大们你们好呀 系列专栏 C 学习与应用 本篇内容 构造函数的概念与特征 基本使用方法 运算符重载 赋值运算符重载 前置 后置 的使用 作者简介 计算机海洋的新进船长一枚 请多多指教 同期文章 C 初阶 简析构造函数 析
  • 告别代码复制粘贴,傻瓜式提取 PyTorch 中间层特征

    内容导读 特征提取是图像处理过程中常需要用到的一种方法 其效果好坏对模型的泛化能力有至关重要的影响 特征提取 Feature extraction 在机器学习 模式识别和图像处理中应用广泛 它从初始的一组测量数据开始 建构出提供信息且不冗余
  • C# Modbus CRC校验

    Modbus CRC校验 直接输入byte 输出bool public static bool CRC Check byte byteData bool Flag false byte CRC new byte 2 UInt16 wCrc

随机推荐

  • React 深入系列1:React 中的元素、组件、实例和节点

    React 深入系列 深入讲解了React中的重点概念 特性和模式等 旨在帮助大家加深对React的理解 以及在项目中更加灵活地使用React React 中的元素 组件 实例和节点 是React中关系密切的4个概念 也是很容易让React
  • 从0搭建react项目

    一 快速开始 全局安装脚手架 npm install g create react app 复制代码 通过脚手架搭建项目 create react app lt 项目名称 gt 复制代码 开始项目 cd lt 项目名 gt npm run
  • 音频-什么是PCM编码格式?

    PCM中文称脉冲编码调制 Pulse Code Modulation 是70年代末发展起来的 记录媒体之一的CD 在80年代初由飞利浦和索尼公司共同推出 脉码调制的音频格式也被DVD A所采用 它支持立体声和5 1环绕声 1999年由DVD
  • 正则表达式-----小数点后允许有两位数字

    校验是否全由数字组成 function isDigit s var patrn 0 9 1 20 if patrn exec s return false return true 校验登录名 只能输入5 20个以字母开头 可带数字 的字串
  • eclipse关联spring源码

    在Eclipse中如何关联spring framework的文档和源代码 1 到官方网站去下载spring framework的jar包 spring framework jar包的下载地址是 http repo spring io rel
  • 解决ubuntu18.04卡在“starting Gnome Display Manager“

    我提前安装了ssh 所以可以ssh进行下面的操作 如果你没有 你可以进入命令行 或者其他模式进行下面的操作 好多人都遇到这个问题 我提前说下 安装驱动之前 最好安装个ssh ssh 怎么用自己百度吧 这样万一你的电脑卡住了 你找个别人的电脑
  • autoApprove

    服务端最主要的一个配置就是使用 EnableAuthorizationServer 注解 该注解的作用就是引入了一些 OAuth2 相关的端点 包含以下的端点 AuthorizationEndpoint 根据用户认证获得授权码 有下面两个方
  • 工作日记:JavaScript生成随机色

    不多啰啰 直接上硬货 获取指定闭区间的随机数 param min 最小值 param max 最大值 returns number export function getRandomNum min max let result if min
  • 2007.08.21单链表的运算(查找,插入,删除)

    2 查找 1 按序号查找 在单链表中 由于每个结点的存储位置都放在其前一结点的next域中 因而即使知道被访问结点的序号i 也不能像顺序表那样直接按序号i访问一维数组中的相应元素 实现随机存取 而只能从链表的头指针出发 顺链域next诸葛结
  • 代理记账公司怎样找客户?教你一个简单又有效的方法

    针对许多初创期公司而言 资金和人力资源管理都非常欠缺 重心点更偏重于业务流程自身 因而会将会计等有关问题交到代理记账公司 实际上这个是较为聪明的作法 代理记账是指将本公司的财务核算 做账 纳税申报等一系列的工作中所有委派给技术专业做账公司进
  • C语言之求两个整数之和

    include
  • uva 120(排序,检索)

    题目 Stacks and Queues are often considered the bread and butter of data structures and find use in architecture parsing o
  • Tesseract 最简单的图片文字识别

    Tesseract是一个开源的库 下面写一个最简单的实例 include stdafx h include strngs h include baseapi h include
  • python: more Layer Architecture and its Implementation in Python and mysql 8.0

    mysql 8 0 drop table DuStudentList 学生表 create table DuStudentList StudentId INT NOT NULL AUTO INCREMENT comment 主键id 自动增
  • [转]SQL的一对多,多对一,一对一,多对多的含义以及使用方法。

    1 一对多 比如说一个班级有很多学生 可是这个班级只有一个班主任 在这个班级中随便找一个人 就会知道他们的班主任是谁 知道了这个班主任就会知道有哪几个学生 这里班主任和学生的关系就是一对多 2 多对一 比如说一个班级有很多学生 可是这个班级
  • Masm for Windows集成开发环境编写汇编程序

    由于最近在学习汇编 用的软件是一款叫 Masm for Windows集成开发环境 但是发现该软件的资料比较少 对于我们这样刚刚学习汇编的同学 我查找了很多资料 下面主要是介绍该工具及2个汇编的基本程序 一 软件的使用 下面是阅读完四川大学
  • 网络编程(JavaEE初阶系列10)

    目录 前言 1 网络编程的基础 1 1为什么需要网络编程 1 2什么是网络编程 1 3网络编程中的基本概念 1 3 1发送端和接收端 1 3 2请求和响应 1 3 3客户端和服务端 2 Socket套接字 2 1概念 2 2分类 3 UDP
  • k8s docker集群搭建

    一 Kubernetes系列之介绍篇 Kubernetes介绍 1 背景介绍 云计算飞速发展 IaaS PaaS SaaS Docker技术突飞猛进 一次构建 到处运行 容器的快速轻量 完整的生态环境 2 什么是kubernetes 首先
  • SpringBoot+Swagger2实现API文档+lombok工具包简化代码

    Swagger UI 提供了一个可视化的UI页面展示描述文件 接口的调用方 测试 项目经理等都可以在该页面中对相关接口进行查阅和做一些简单的接口请求 该项目支持在线导入描述文件和本地部署UI项目 lombok是一个可以帮助我们简化java代
  • linux自定义信号,并kill测试

    1 自定义信号的说明 有时候我们需要在程序中利用信号来控制程序行为 linux为我们提供了2个已经定义的信号SIGUSR1和SIGUSR2 一般的程序利用这2个信号已经能满足需要 不过我最近需要一些其他信号来避免覆盖原来的信号处理函数 上网