1. 自定义信号的说明

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

#define MYSIG_MSG        (SIGUSR2 + 1)
// 定义信号然后注册处理函数

然后到系统里查了一下,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作为自定义信号。然后程序里就多了下面的代码:

#define MYSIG_MSG        (SIGRTMIN+ 1)

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

switch (signo){case MYSIG_MSG:break ;
}

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

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

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

#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也有类似的情况。同时头文件下面也有:

/* 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+10void    sigactionProcess(int nsig)
{//================================================================//TODO:ADD YOU CODEprintf("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不会阻塞,没有退出会返回0if ((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 自定义信号 测试kill信号发送相关推荐

  1. iphone有什么软件测试信号,iphone12信号测试-iphone12信号实测

    iPhone12这次对比上一代最为重大的升级,就是全系四款机型都支持5G,那么iphone12的信号怎么样,有哪些改善与提升呢,接下来小编就带来全方位的iphone12信号实测,一起看看吧! 一.ip ...

  2. 小米5s信号测试软件,信号覆盖整个足球场!小米官方发布AX6000测试

    今日,小米手机官方发布了一个小米11手机搭配小米AX6000的Wi-Fi 极限测试视频,展示了其覆盖整个足球场的可怕信号覆盖能力. 在视频中,测试人员将一台小米AX6000路由器放在足球场的正中央,接 ...

  3. mix3信号测试软件,信号才是手机的基础,小米MIX3面临三个信号难题,它做了什么?...

    原标题:信号才是手机的基础,小米MIX3面临三个信号难题,它做了什么? 我们再选择手机时,关注手机的外形.手机的性能.手机的拍照.手机的屏幕,但是一个经常被我们忽略的一点,却有极其重要就是接受信号的能 ...

  4. 700m信号测试软件,iPhone12信号测试,iPhone12信号实测

    iPhone手机的信号和它的续航一样一直受到广大用户的吐槽,而今年的iPhone12系列虽然电池容量依旧尿崩,但是全系使用上了高通X55基带,在信号上有了明显的改善,那么iPhone12信号究竟怎么样 ...

  5. zigbee信号测试软件,zigbee 信号测试.pdf

    zigbee 信号测试 Zigbee 信号测试 Zigbee 信道频率 第一个信道ch11是2.4G ISM 频段, 最后一个信道是ch 26, 总共16 个信道. 信道空间是5MHz Zigbee ...

  6. linux 信号9和信号15,kill -9 和 kill -15 的区别

    相信很多程序员对于Linux系统都不陌生,即使自己的日常开发机器不是Linux,那么线上服务器也大部分都是的,所以,掌握常用的Linux命令也是程序员必备的技能. 但是,怕就怕很多人对于部分命令只是一 ...

  7. Linux进程间通信第三讲 信号signal kill

    目录 三.信号(signal) 3.1 概念 3.2 信号的处理 3.3 信号的发送 3.4 信号的屏蔽 三.信号(signal) 3.1 概念 信号本质上是一种软件中断 软件触发的中断.和硬件的处理 ...

  8. linux kill信号列表

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

  9. linux 信号 core,Shell 信号发送与捕捉

    原标题:Shell 信号发送与捕捉 作者:李振良OK 1.Linux信号类型 信号(Signal):信号是在软件层次上对中断机制的一种模拟,通过给一个进程发送信号,执行相应的处理函数. 进程可以通过三 ...

最新文章

  1. keras和tensorflow使用 fit_generator 批次训练
  2. java binarytreenode_LeetCode算法题-Binary Tree Paths(Java实现-3种解法)
  3. Linux查看时间段文件,Linux查看特定时间段内修改过的文件
  4. android使用post方法登录,使用REST API使用POST方法在Android中登录示例
  5. FJ的字符串(字符串)
  6. Java删除文件和文件夹的方式
  7. Unity3D游戏开发之MMD For Unity插件研究
  8. 实战手游新手流程:细节、反馈、体验
  9. linux数字版权管理,数字版权管理系统 DRM
  10. mysql可以存储.wav文件吗_手机迅雷下载的视频文件存储路径位置、iPad可以下载迅雷...
  11. 基于ERNIR3.0文本分类:(KUAKE-QIC)意图识别多分类(单标签)
  12. Markdown教程常用语法随笔
  13. Kafka HighLevel API与LowLevel API说明
  14. 存图片和视频到iPhone相册
  15. oracle 10g 新特性中文笔记
  16. 15本经典金融投资著作
  17. MySQL_Windows 下重启MySQL服务
  18. latency延迟分析处理
  19. 带你快速看完9.8分神作《Effective Java》—— 类和接口篇
  20. autoit几行代码实现QQ自动发送消息,点赞,去空间留言。

热门文章

  1. java web 自定义标签_如何在JavaWeb程序中使用自定义标签
  2. channel rabbitmq 配置_「喵咪MQ(2)」RabbitMQ单机模式使用
  3. Altium Designer隐藏电气连接线
  4. 制作旋转LED的经验
  5. sql server 内存初探
  6. 【300】◀▶ IDL - ENVI API
  7. Ubuntu 16.04安装QtCharts时报错:'qtConfig' is not a recognized test function.
  8. Ubuntu 16.04安装VMware-Workstation-12
  9. ORACLE分区表详解
  10. java debug体系为什么不能debug到jdk里所有的代码