信号

转载 2015年07月06日 19:31:44

参考

http://kenby.iteye.com/blog/1173862

信号是UNIX和LINUX系统响应某些条件而产生的一个事件,接受到该信号的进程会采取相应的行动。

信号由某些错误条件而生成的,如内存段冲突,浮点处理器错误和非法指令,由shell和终端处理器生成来引起中断,它们还可以作为在进程传递消息或修改行为的方式,明确的由一个进程传递给另一个进程。信号可以被生成,捕获,响应或忽略(对于某些信号)。

信号的名称在头文件signal.h以SIG开始。

ctr+c会向前台程序发送SIGINT信号,默认是终止程序。

通常给不是前台进程发送信号的方法

kill/killall -HUP pid (killall给所有进程发送信号)

处理信号函数

#include<signal.h>

void (*signal(int sig,void(* func)(int)))(int)//返回一个 void * (*func)(int) signal(int sig, void(*func)(int))

指定某个信号的处理函数,函数的声明 void (*func)(int), signal的第一个参数指定信号,第二个参数指定处理函数,可以使用SIG_IGN(忽略),SIG_DFL(默认)。当程序设置一个自己定义的信号处理函数进行捕获处理的时候,每次都换调用,代替系统原有的处理。signal捕获的信号是不可捕获的或不可忽略的时候将调用失败,errno将被设置EINVAL。

发送信号

进程可以通过调用kill给包括自己在内的进程发送信号,当调用失败的时候一般是由于权限的问题。

#include<sys/types.h>

#include<signal.h>

int kill(pid_t pid,int sig);

kill向指定的pid发送信号sig,当成功的时候返回0,失败返回负的,errno被设置为EINVAL代表信号无效,EPERM代表权限不够,ESRCH代表目标进程不存在。

#include<unistd.h>

unsiganed int alarm(unsigned int seconds);

alarm在seconds秒后发送信号SIGALRM,由于调度和处理的时间的延迟则会迟发,seconds设置为0则取消原先所有的alarm,在alarm的等待时间中重新调用alarm则重新开始计时,每一个进程只能有一个闹钟时间,返回值返回的是以前剩余的秒数,失败返回-1.

#include<unistd.h>

int pause(void)

进程被挂起等待信号到来。


健壮的信号接口

#include<signal.h>

int sigaction(int sig,const struct sigaction *act, struct sigaction *oact)

sigaction包括以下成员

void (*)(int) sa_handler /*function, SIG_DFL,SIG_IGN

sigset_t sa_mask /*signals to block in sa_handler

int sa_flags /*signal action modifiers

sa_mask成员指定一个信号集,在调用sa_handler所指向的信号函数之前,该信号集将被加入到进程的信号屏蔽字中,这是一组将被阻塞且不会传递给进程的信号。设置信号屏蔽字可以防止看到信号在它的处理函数还未运行结束时就接收到的情况。

sigaction函数设置的信号处理函数在默认情况下不被重置的,如果进行重置,就必须在sa_falgs成员中包含值SA_RESETAND.



相关文章推荐

基于Qt的函数对象(泛化仿函数)设计,可在线程中运行并通过信号返回QVariant

//复制以下代码,放到一个.h文件中,即可应用。 //qxfunctionobject.h #ifndef FUNCTION_OBJECT_H #define FUNCTION_OBJE...

数字信号处理 DIT-FFT和IFFT的 C语言程序实现

这篇文章是我们《数字信号处理》课程的一个作业,作业要求是将自己的学号扩展长度为1024的序列,然后对序列进行dit-fft和ifft,进行C语言编程。主体程序来自于度娘,自己进行了程序修改,倒序部分和...

第二讲 Basic Signals基本信号

笔记整理,原笔记完成于2014/06/24,整理于2015年4月17日。
  • Phoeus
  • Phoeus
  • 2015年04月17日 21:56
  • 346

QT 信号与槽不在同一个线程 connect

主线程中发出一个信号,另一个线程槽函数没有响应,这个问题搞了好几个小时,才发现原来是connect时候的第5个参数写错了,在这里做下备注吧。 connect用于连接qt的信号和槽,在qt编程过程...

Linux下调用fork或system启动子进程的信号和资源释放相关问题

最近一段时间,公司的网管系统二期优化需要新增功能,实现对网管客户端程序进行保护的监控脚本的自动更新及保护进程的监控告警。网管客户端程序分为两部分:客户端GatherClient及保护进程gatherc...

语音学习笔记4------matlab实现逆向生成音频格式的信号audiowrite()函数

语音处理中,都是讲语音信号分解成时域范围内波形,或者频域范围内的图。比如经过傅里叶变换生成的频谱图。那么加入我们知道一堆的声音数据,我们怎么将它们还原成规定的音频格式呢,可以是mp3,wav等等的音频...

超宽带信号高速数据采集存储系统—采样率5GSPS,模拟带宽3GHZ,记录存储带宽6GB/S!

高速数据采集存储系统 —全球顶级超宽带信号高速数据采集存储系统5GSPS,6000MB/S!  西安慕雷电子供应全球顶级高速数据采集卡及超宽带信号高速数据采集存储系统。作为顶尖的高速数据采集卡生产...

详解UCOS中的互斥信号量

二值信号量主要用于进行共享资源的独占式访问,比如我们用一个变量来标志一个资源是否可用,当这个变量为1的时候表示资源可用,当这个资源为0的时候表示资源不可用,但是二值信号量容易产生优先级反转,影响系统的...

QML中信号槽机制的使用

QT的最大特点就是信号槽了,自然QML也必须支持。不过呢,稍微会有些不同,比较语言不同了嘛。 QML中信号槽连接有三种方式: 第一种我们已经使用过了,就是类似onclicked这样的。 比如下面的代码...

多线程六 经典线程同步之信号量Semaphore

1、首先来看看如何使用信号量     信号量Semaphore常用有三个函数,使用很方便。下面是这几个函数的原型和使用说明。 第一个 CreateSemaphore 函数功能:创建信号量 函...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:信号
举报原因:
原因补充:

(最多只允许输入30个字)