linux中的信号机制
- 概述
- 信号机制的两个常用函数
signal
#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int);
返回值:若成功则返回信号以前的处理配置,如果出差则返回SIG_ERR;
或者用如下的定义:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signo, sighandler_t handler);
这个函数的功能是捕捉到相应的信号(signo),并用相应的处理函数(func/handler)来对信号进行相应的相应,是会替代原来的处理函数。但是要和足以,SIGKILL和SIGSTOP这两个信号是既不能被捕捉也不能被忽略的!(当时我们做一个后台程序,我还想用捕捉SIGKILL的方式来免杀呢)。
KILL
#include<signal.h>
int kill(pid_t pid, int sig);
这个函数的功能是将信号发送给进程或者进程组。
pid > 0 :要发送信号的进程号
pid = 0 :信号被发送到所以和当前进程在同一个进程组的进程
pid = -1 : 信号发送给发送进程有权限向他们发送信号的系统上的所以进程
pid < -1 :信号发送给其进程组ID等于pid的绝对值
- 几个比较常用的信号
SIGIGN:忽略改信号
SIGDEF:采用系统默认方式处理信号
SIGCHLD:在一个进程终止或者停止时,将该信号发送给其父进程,父进程的wait函数通常用来捕捉这个信号
SIGINT:当用户按中断键(delete/ctrl+c)时将产生这个信号
SIGKILL:此信号可以用于杀死一个进程
SIGSTOP:这是个作业控制信号,用于停止一个进程 这个信号和SIGKILL是仅有的两个不能被捕获或忽略的信号
SYSUSR1/2:用户定义的信号,用于应用程序
- 程序演示
/*************************************************************************
> File Name: signal.c
> Author: he xingjie
> Mail: gxmshxj@163.com
> Created Time: Fri 25 Oct 2013 07:53:56 AM PDT
************************************************************************/ #include<stdio.h>
#include<stdlib.h>
#include<signal.h> void my_func(int sig_no){
if(sig_no == SIGUSR1)
printf("Receive SIGUSR1.\n");
if(sig_no == SIGUSR2)
printf("Receive SIGUSR2.\n");
if(sig_no == SIGINT)
printf("Receive SIGINT.\n");
} int main(void)
{
if(signal(SIGUSR1, my_func) == SIG_ERR)
printf("can't catch SIGUSR1.\n'");
if(signal(SIGUSR2, my_func) == SIG_ERR)
printf("can't catch SIGUSR2.\n'");
if(signal(SIGINT, my_func) == SIG_ERR)
printf("can't catch SIGINT.\n'"); kill(getpid(),SIGINT); while();
return ;
}
当运行这个程序的时候,我们将会看到:Receive SIGINT. 然后程序不断在循环,如果我们按ctrl+c,将会输出:Receive SIGINT.
如果我们把程序放在后天运行,并且用 kill -USR1 pid。pid为那个进程的id,我们还将会看到Receive SIGUSR1.
- 参考资料
[1] UNIX环境高级编程
[2] 我们老师上课的课件
linux中的信号机制的更多相关文章
- Linux内核中的信号机制--一个简单的例子【转】
本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123 ...
- 浅谈Linux中的信号处理机制(二)
首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...
- 多线程中的信号机制--signwait()函数【转】
本文转载自:http://blog.csdn.net/yusiguyuan/article/details/14237277 在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别, ...
- Linux中的保护机制
Linux中的保护机制 在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了NX.PIE等机制,例如存在NX的话就不能直接执行栈上的数据,存在PIE 的话各个系统调用的地址就是随机化的. 一:ca ...
- 25 Linux中的信号
Linux中的信号 信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件).每个信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD.SIGINT等,它们在系统头文件中定义,也可以通 ...
- 浅谈Linux中的信号处理机制(一)
有好些日子没有写博客了,自己想想还是不要荒废了时间,写点儿东西记录自己的成长还是百利无一害的.今天是9月17号,暑假在某家游戏公司实习了一段时间,做的事情是在Windows上用c++写一些游戏英雄技能 ...
- linux中的signal机制(转)
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全 ...
- Linux下的信号机制
2017-04-06 之前在看LinuxThreads线程模型的时候,看到该模型是通过信号实现线程间的同步,当时没有多想,直接当做信号量了,现在想起来真是汗颜……后来想想并不是那么回事,于是,就有了今 ...
- linux下 signal信号机制的透彻分析与各种实例讲解
转自:http://blog.sina.com.cn/s/blog_636a55070101vs2d.html 转自:http://blog.csdn.net/tiany524/article/det ...
随机推荐
- SQLite中的WHERE子句
SQLite中的WHERE子句 WHERE子句用于从FROM子句生成的工作表中过滤行.它提供了对每一行进行判断的表达式.当表达式返回的值为false或NULL时,此行就会被丢弃.这种丢弃只是删除记录, ...
- 蓝牙扫描工具btscanner修复暴力扫描模式
蓝牙扫描工具btscanner修复暴力扫描模式 在btscanner 2.1-5版本中,当用户按下快捷键b,执行暴力扫描模式,会出现程序奔溃问题.该问题现在已经修复.用户只需要更新系统,将btsc ...
- u3d 元件的克隆 Cloning of u3d components
u3d 元件的克隆 Cloning of u3d components 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 3131 ...
- MySQL数据库-----基本命令操作
小编之前一直想要了解一下,如何搭建数据库,这里分享一下在此之前的一些准备工作,首先小编是先了解数据库(mysql),以下是小编的一些认识: 一.mysql常用命令1.mysql登录和退出 登录:mys ...
- Java 之递归遍历目录
Java 之递归遍历目录 一.内容 输出指定目录(文件夹)下的所有文件(包括目录)的绝对路径 二.源代码:RecursiveListDirectory.java package cn.com.zfc. ...
- C/C++中的常量指针与指针常量(转)
常量指针 常量指针是指向常量的指针,指针指向的内存地址的内容是不可修改的. 常量指针定义“const int *p=&a;”告诉编译器,*p是常量,不能将*p作为左值进行操作.但这里的指针p还 ...
- 三大分析法——SWOT、PEST、波特五力
SWOT分析法 「SWOT分析模型简介」 (也称TOWS分析法.道斯矩阵).在现在的战略规划报告里,SWOT分析应该算是一个众所周知的工具.来自于麦肯锡咨询公司的SWOT分析,包括分析企业的优势(St ...
- windows环境下面批量新建文件夹
md D:批量新建文件夹\2026 md D:批量新建文件夹\2030 md D:批量新建文件夹\2032 md D:批量新建文件夹\1835 md D:批量新建文件夹\1832 电脑桌面新建文档 - ...
- [数据结构与算法分析(Mark Allen Weiss)]不相交集 @ Python
最简单的不相交集的实现,来自MAW的<数据结构与算法分析>. 代码: class DisjSet: def __init__(self, NumSets): self.S = [0 for ...
- AS 自定义 Gradle plugin 插件 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...