一、函数描述

#include <signal.h>

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

signal()会将接收到的signum信号交给hander(可以是SIG_IGN, SIG_DFL)处理,signal()的功能会跟随着Unix版本的变化而变化。

当这个进程收到这个signum信号后,处理如下:

  ①如果handler是SIG_IGN,此信号被忽略

  ②如果handler是SIG_DFL,将由系统按默认的方法处理

  ③指定给handler函数来处理此信号。

返回值:signal()返回信号处理程序的前一个值,或者返回错误的SIG_ERR

注意:signal()在多线程进程中的影响是未指定的.

1.kill -l 列出所有信号;ctrl + c 产生SIGINT信号

2.#include <unistd.h>
int pause(void);

pause()会导致调用进程(或线程)进入休眠状态,直到收到信号,此时会终止进程或引起信号捕获函数的调用。

pause() 仅在信号被捕获并且信号捕获函数返回时才返回。 在这种情况下,pause()返回-1,errno被设置为EINTR。

.select() poll() epoll() 都是基于信号的!

4.kill函数将信号发送给进程,raise函数允许进程向自身发送信号;
int kill(pid_t pid, int sig); //kill()系统调用可用于将任何信号发送到任何进程组或进程

5.int raise(int sig);
raise()向调用进程或线程发送信号(本线程/进程).在单线程进程中它等同于kill(getpid(), sig);
在多线程进程中它等同于pthread_kill(pthread_self(), sig);
如果信号导致处理程序被调用,那么raise()在信号处理程序返回后才会返回,成功返回0

6.用户自定义信号:SIGUSR1 和 SIGUSR2的使用:kill -USR1 processID 和 kill -USR2 processID

7.unsigned int alarm(unsigned int seconds); alarm函数设置了一个定时器,当定时器到了就发送SIGALRM信号

8.void abort(void); //让进程捕捉SIGABRT的意图是,在进程终止前由其执行所需的清理操作。

abort()首先开放SIGABRT信号,然后向调用进程发送此信号。 这将导致进程异常终止,除非SIGABRT信号被捕获且信号处理程序不返回。
如果abort()函数导致进程终止,则所有打开的流将关闭并刷新。
如果SIGABRT信号被忽略,或者被返回的处理程序捕获,abort()函数仍将终止该进程。此函数是通过先恢复SIGABRT的缺省处置,
然后再次产生此信号来完成此操作的。abort()函数永远不会返回。

二、使用例子

用户信号的使用:
#include <stdio.h>
#include <unistd.h>
#include <signal.h> static void sig_usr_fun(int signo)
{
if (signo == SIGUSR1)
{
printf("received SIGUSR1!\n");
}
else if (signo == SIGUSR2)
{
printf("receive SIGUSR2!\n");
}
} int main()
{
if (signal(SIGUSR1, sig_usr_fun) == SIG_ERR)
{
printf("signal1 error!\n");
} if (signal(SIGUSR1, sig_usr_fun) == SIG_ERR)
{
printf("signal2 error!\n");
} for (;;)
{
pause();
} return ;
} kill -SIGUSR1 15504
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
int ext = ;
static void sig_fun(int signo)
{
ext = ;
printf("Catch Signal SIGINT\n");
} int main()
{
char *p = NULL;
int count = ;
p = malloc();
signal(SIGINT, sig_fun); while(){
if(ext){
break;
}
count++;
} if(p != NULL){
free(p);
     p = NULL;
printf("p has been freed!\n");
}
} 收到信号强制终止时释放资源,以免内存泄漏
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
void catch_signal(int sign)
{
switch(sign)
{
case SIGALRM:
printf("SIGALRM Signal\n");
}
}
int main()
{
signal(SIGALRM, catch_signal);
alarm();
printf("================\n");
pause();
return ;
}

signal()信号操作的更多相关文章

  1. linux signal 处理

    v/:* {behavior:url(#default#VML);} o/:* {behavior:url(#default#VML);} w/:* {behavior:url(#default#VM ...

  2. linux下 signal信号机制的透彻分析与各种实例讲解

    转自:http://blog.sina.com.cn/s/blog_636a55070101vs2d.html 转自:http://blog.csdn.net/tiany524/article/det ...

  3. xenomai内核解析之信号signal(一)---Linux信号机制

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 目录 1. Linux信号 1.1注册信号处理函数 ...

  4. 异步处理方式之信号(一):基础知识和signal函数说明

    文章目录 1. 引言 2. 信号的概念 2.1 信号操作之忽略信号 2.2 信号操作之捕捉信号 2.3 信号操作之执行系统默认操作 2.4 常见的信号 3. 函数signal 3.1 signal函数 ...

  5. java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)

    一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...

  6. ReactiveCocoa代码实践之-UI组件的RAC信号操作

    上一节是自己对网络层的一些重构,本节是自己一些代码小实践做出的一些demo程序,基本涵盖大多数UI控件操作. 一.用UISlider实现调色板 假设我们现在做一个demo,上面有一个View用来展示颜 ...

  7. Linux 信号(二)—— signal 函数

    弗洛伊德认为:要解决这些苦恼,当事人就要通过回忆并理解自己早期的童年经历,来获得对潜意识冲突的顿悟.弗洛伊德的疗法被称为“精神分析” (psychoanalysis),在 20 世纪的很长一段时间被心 ...

  8. Fatal signal xx (SIGSEGV) at

    Fatal signal 11问题的解决方法 http://blog.csdn.net/tankai19880619/article/details/9004619 如何定位Android NDK开发 ...

  9. php php-5.6.4.tar.bz2 apache 兼容问题 child pid 27858 exit signal Segmentation fault

    环境 [root envirotar]# uname -a Linux i2..el6.x86_64 # SMP Thu Jul :: UTC x86_64 x86_64 x86_64 GNU/Lin ...

随机推荐

  1. External RNA Controls Consortium (ERCC)

    ERCC是啥? 外部RNA控制联盟,就是一套RNA-seq,基因表达检测过程中的控制系统,使得结果具有可重复性. RNA Spike-in Controls for Gene Expression W ...

  2. 1月11日Atom 插件安装。

    查看已安装的Atom插件(前提:已经安装Atom) 打开终端 输入apm ls命令,回车. 未安装任何插件时,显示如下 Built-in Atom packages (89) ...此处省略... / ...

  3. oracle使用(1)

    纯粹是记录工作中使用的分析函数或是语法点,不做其他用处. (1) with as 先举个例子吧: 有两张表,分别为A.B,求得一个字段的值先在表A中寻找,如果A表中存在数据,则输出A表的值:如果A表中 ...

  4. JavaScript 对象的使用

    JavaScript支持面向对象的编程方法. 2.9.1 window对象(窗口对象)的常用方法 内部函数 alert ( ) ,实际上是 window 对象的方法,写成全称为 window . al ...

  5. 微信小程序 -- 数据请求

    微信小程序 -- 数据请求 微信小程序请求数据,并不是一个可以在url打开有数据就可以拿到数据那么简单 浏览器地址输入 可以获取参数的url 微信小程序中 代码展示 wxml <view> ...

  6. java并发编程:线程安全管理类--原子操作类--AtomicMarkableReference<V>

    1.类 AtomicMarkableReference<V> public class AtomicMarkableReference<V>extends Object Ato ...

  7. python 数据科学

    参考资料: https://www.yiibai.com/python_data_science/python_bubble_charts.html

  8. HP-UNIX操作系统root账号被锁定的两种解决方法

    方法一:到单用户取消trusted system, 重新激活账户 a.重起机器,自检完成后,会出现这一行"To discontinue, press any key in 10 second ...

  9. 玩转X-CTR100 l STM32F4 l UCOS-III移植

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 概述 前后台系统 简单的小型系统设计一般是基于前后台 ...

  10. 关于junk jack

    旨在利用一切物品打造你自己的世界.你需要砍树获得木头,挖各种矿石用火炉炼成不同东西,顺便得到不同颜色材质的石头建房子,打各种家禽获得吃的甚至烘焙.养起来繁殖,天上掉下的星星.捡到圣诞礼包中的袜子都可以 ...