1. signal函数:

#include <signal.h>

void (*signal(int signo, void (*func)(int)))(int);

ret-成功返回信号以前的处理配置 出错返回SIG_ERR

比较容易理解的形式:

typedef void Sigfunc(int);

Sigfunc *signal(int, Sigfunc *);

三个宏定义:

#define SIG_ERR (void(*)())-1 //这里应该是早期写法 函数声明 不检查参数类型 #define SIG_ERR(void(*) (int))-1
#define SIG_DFL (void(*)())0
#define SIG_IGN (void(*)())1

SIG_ERR: 信号注册失败返回SIG_ERR

SIG_DFL: 采用系统对此信号的默认动作;

SIG_IGN: 忽略此信号,注意SIGKILL和SIGSTOP不能忽略;

这三个宏定义不是一定要使用上面的三个值,但是必须是不能声明函数的地址;

2. 进程启动和创建都信号影响;

程序启动:当执行一个程序时,所有信号的状态都是系统默认或者忽略。通常所有的信号都被设置成他们的默认动作,除非调用exec的进程忽略该信号。确切的讲,exec函数将原先设置为要捕捉的信号都更改为它们的默认动作,其他信号的状态则不变;(对于一个进程原先要捕捉的信号,当其执行了一个新程序后,自然不能再捕捉它了,因为信号捕捉函数的地址很可能在所执行的新程序文件中已无意义)

进程创建:当一个进程调用fork时,其子进程继承父进程的信号处理方式。因为子进程在开始时恢复了父进程的存储映像,所以信号捕捉函数的地址在子进程中是有意义的;

3. kill和raise函数:

kill函数将信号发送给进程组。raise函数则允许进程向自身发送信号;

#include <signal.h>

int kill(pid_t, int signo);
int raise(int signo);

raise(signo) == kill(getpid(), signo)

kill函数pid参数:

pid>0: 发送信号给进程ID为pid的进程;

pid==0: 发送信号给与发送进程属于同一进程组的所有进程,而且发送进程具有向这些进程发送信号的权限;

pid<0: 发送信号给其他进程组ID等于pid的绝对值,而且发送进程具有向这些进程发送信号的权限;

pid==-1: 发送信号给发送进程有权限向他们发送信号的系统上的所有进程;

4. alarm和pause函数

#include <unistd.h>

unsigned int alarm (unsigned int seconds);

ret - 0或者以前设置的闹钟时间的余留秒数

alarm函数设定一个定时器,经过指定的seconds秒后会产生一个SIGALRM信号;如果不忽略或者不捕捉,其默认动作是终止进程;

如果第一次设置的没有超时,那么第二次设置的时候alarm返回第一次设置的余留秒数作为返回值,并且旧闹钟被替代;如果本次参数为0,则取消第一次的闹钟,返回余留秒数;

#include <unistd.h>

int pause(void);

ret- -, 并将erron设置为EINTR

pause只有执行了一个信号处理程序并从其返回时,pause才返回,在这种情况下,pause返回-1,并设置errno为EINTR;

5. 信号集:

#include <signal.h>

int sigemptyset(sigset_t *set); //初始化由set指向的信号集,清除其中所有信号
int sigfillset(sigset_t *set); //初始化由set指向的信号集,包含其所有信号
int sigaddset(sigset_t *set, int signo); //添加信号到信号集
int sigdelset(sigset_t *set, int signo); //删除信号到信号集 ret-成功返回0 失败返回- int sigismember(const sigset_t *set, int signo); //某信号是否为信号集成员
ret-真返回1,假返回0,出错返回-

6. sigprocmask函数

#include <signal.h>

int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);

首先,若oset!=NULL,那么进程当前的信号屏蔽字通过oset返回;

其次,若set!=NULL,则参数how指示了如何修改当前信号屏蔽字;

注意,不能阻塞SIGKILL和SIGSTOP

how-SIG_BLOCK: 该进程信号屏蔽字是其当前信号屏蔽字和set指向信号集的并集;set包含了我们希望阻塞的附加信号;

SIG_UNBLOCK: 该进程信号屏蔽字是其当前信号屏蔽字和set指向信号集补集的交集;set包含我们希望解除阻塞的信号;

SIG_SETMASK: 该进程的信号屏蔽字将被set指向的信号集来替代;

如果SET==NULL,则how无意义;

7. sigpending函数:

#include <signal.h>

int sigpending(sigset_t *set);

ret-成功返回0 出错返回-1

函数返回信号集,其中各个信号对于调用进程是阻塞的而不能递送的,因而也一定是当前未决的;

8. sigaction函数:

#include <signal.h>

int sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact);

ret-成功返回0 出错返回-

9. sigsuspend函数:

#include <signal.h>

int sigsuspend(const sigset_t *sigmask);

ret- -,并errno设置为EINTR

函数提供了一个原子操作中先恢复信号屏蔽字,然后使进程休眠;

将进程的信号屏蔽字的值设置为由sigmask指向的值。在捕捉到一个信号或者发生了一个会终止该进程的信号之前,该进程将被挂起。如果捕捉到一个信号而且从该信号处理程序返回,则sigsuspend返回,并且将该进程的信号屏蔽字设置为调用sigsuspend之前的值;

10. abort()函数:

#include <stdlib.h>

void abort(void);

此函数将SIGABRT信号发送给调用进程。让进程捕捉该信号的意图是,在进程终止前由其执行所需清理操作。

12. sleep()函数:

#include <unistd.h>

unsigned int sleep(unsigned int seconds);

ret-0或者未休眠的秒数

此函数使调用进程被挂起,直到满足以下条件之一:

(1) 已经过了seconds所指定的墙上时钟时间;

(2) 调用进程捕捉到一个信号并从信号处理程序中返回;

n. 测试代码:

 #include <unistd.h>
#include <stdio.h>
#include <signal.h> static void sig_user(int signo)
{
if (signo == SIGUSR1){
printf("reveived SIGUSR1\n");
}
else if (signo == SIGUSR2){
printf("reveived SIGUSR2\n");
}
} int main()
{
if (signal(SIGUSR1, sig_user) == SIG_ERR){
perror("can't catch SIGUSR1\n");
} if (signal(SIGUSR2, sig_user) == SIG_ERR){
perror("can't catch SIGUSR2\n");
} for ( ; ; ){
pause();
} return ;
}

Linux信号函数的更多相关文章

  1. Linux信号、信号处理和信号处理函数

    信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可 ...

  2. Linux信号

    信号本质上就是一个软件中断,它既可以作为两个进程间的通信的方式, 更重要的是, 信号可以终止一个正常程序的执行, 通常被用于处理意外情况 ,* 信号是异步的, 也就是进程并不知道信号何时会到达 $ki ...

  3. Linux信号基础

    Linux信号基础   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Linux进程基础一文中已经提到,Linux以进程为单位来 ...

  4. Linux信号(signal) 机制分析

    Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...

  5. [置顶] Linux信号相关笔记

    最近又温习了一遍Linux中的信号知识,发现有很多东西以前没有注意到,就通过这篇博客记录一下,巩固一下知识点. 一,信号基础: 信号是什么?为了回答这个问题,首先要从异常说起,这里的异常不是指c++/ ...

  6. 利用linux信号机制调试段错误(Segment fault)

    在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...

  7. Linux信号实践(2) --信号分类

    信号分类 不可靠信号 Linux信号机制基本上是从UNIX系统中继承过来的.早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号 ...

  8. 非常好的一篇对linux信号(signal)的解析 (转载)【转】

    转自:https://blog.csdn.net/return_cc/article/details/78845346 Linux信号(signal) 机制分析 转载至:https://www.cnb ...

  9. linux select函数详解

    linux select函数详解 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状 ...

随机推荐

  1. C# 跨服务大文件复制

    跨服务的大文件复制,肯定要和本地大文件复制一样,分多次传递,要不然内存也承受不了,下面就说下如何实现大文件的跨服务复制······ 首先肯定要建立一个WCF的服务以及对应的客户端来测试服务,此方法请参 ...

  2. CF997B Roman Digits

    题意翻译 给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少. 题目描述 You are given an unweighted ...

  3. [洛谷P4822][BJWC2012]冻结

    题目大意:有一张$n(n\leqslant50)$个点$m(m\leqslant1000)$条边的无向图,可以使得$k$条边使得边权减半,求最短路 题解:分层图最短路 卡点:无 C++ Code: # ...

  4. BZOJ3932:[CQOI2015]任务查询系统——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3932 题面源于洛谷 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成 ...

  5. 阿里云遇到的坑:CentOS7防火墙(Firewalld),你关了吗?

    阿里云官方教程: https://help.aliyun.com/knowledge_detail/41317.html 百度参考的牛人教程(推荐): http://www.111cn.net/sys ...

  6. Ubuntu16.04+Cuda8.0+1080ti+caffe+免OpenCV3.2.0+faster-rCNN教程

    一.事先声明:1.Ubuntu版本:Ubuntu使用的是16.04.而不是16.04.1或16.04.2,这三个是有区别的.笔者曾有过这样的经历,Git上一个SLAM地图构建程序在Ubuntu14.0 ...

  7. 理解Linux文件系统挂载参数noatime nodiratime

    很多线上服务器为了提供文件系统IO性能,会在挂载文件系统的时候指定“noatime,nodiratime”参数,意味着当访问一个文件和目录的时候,access time都不会更新.但是如果未指定上面的 ...

  8. 再来说一说sudo

    app        ALL = (ALL:ALL) ALL eric.zhan ALL = (app : app) ALLDefaults:eric.zhan runas_default=app 如 ...

  9. bzoj 1132 [POI2008]Tro 几何

    [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1796  Solved: 604[Submit][Status][Discu ...

  10. Struts整合ExtJS

    1准备工作: 除了平时引入的struts2的jar包以外,还需要引入struts2-json-plugin-2.1.8.1.jar:json-lib-2.1.jar这两个包. 2.建立我们的model ...