信号

转载 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.



Linux信号列表

我们运行如下命令,可看到Linux支持的信号列表:$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTR...
  • baobao8505
  • baobao8505
  • 2006年08月25日 08:35
  • 36208

彻底理解宽带信号在频域分解为窄带信号

1.    ISM方法 ISM(incoherent signal method)方法,即非相干信号子空间方法是最早出现的宽带DOA方法,该方法将宽带信号在频域内分解成J 个窄带分量,然后再每个子带上...
  • liusandian
  • liusandian
  • 2016年07月20日 11:35
  • 2294

windows程序事件的信号状态和非信号状态

有信号状态:说明这个对象现在有信号,等待这个对象信号的线程都有机会获得信号,从而继续运行非信号状态:说明这个对象现在没有信号,等待这个对象信号的线程都要阻塞,只到对象变为有信号为止...
  • gtkknd
  • gtkknd
  • 2017年03月10日 07:52
  • 621

linux常用信号列表

SIGHUP:本信号在用户终端结束时发出,通常是在终端的控制进程结束时,通知同一会话期内的各个作业,这时他们与控制终端不在关联。比如,登录linux时,系统会自动分配给登录用户一个控制终端,在这个终端...
  • sddxqlrjxr
  • sddxqlrjxr
  • 2016年04月26日 12:54
  • 2844

Unix系统中常用的信号含义

编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信...
  • u012349696
  • u012349696
  • 2016年02月18日 17:31
  • 1757

linux信号基本概念及如何产生信号

阅前须知本文的主要内容有:1.信号的基本概念(包括进程对信号的3种处理方式)2.特殊信号举例:写代码证明信号存在,并实现信号的简单捕捉3.如何产生一个信号(代码举例:mykill的实现)其中拓展知识有...
  • summy_J
  • summy_J
  • 2017年06月14日 09:34
  • 846

Linux下信号的基本使用与分析

1.基本概念信号是事件发生时对进程的通知机制,一个进程可以想另一个进程发送信号,此做法可以实现进程间的同步,然而给进程发信号的通常都是内核(1)内核一般都会在发生以下事件时给进程发信号 .硬件发生异...
  • Shreck66
  • Shreck66
  • 2015年07月26日 23:30
  • 1425

IQ信号是什么

什么是I/Q信号 当前的数字射频芯片,无一例外的用到了I/Q信号,就算是RFID芯片,内部也用到了I/Q信号,然而绝大部分射频人员,对于IQ的了解除了名字之外,基本上一无所知。 网上有大量关于...
  • wu_cai_
  • wu_cai_
  • 2015年06月14日 19:11
  • 5907

信号的解析表示

对于一个带通信号, X(f)为x(t)的傅里叶变换,u(f)为单位阶跃函数,X+(f)为正频率部分的傅里叶变换,对其做傅里叶反变换, ,可以表示为x+(t),这个信号称为解析信号。    定义...
  • u011608357
  • u011608357
  • 2013年12月10日 10:30
  • 2495

shell捕捉信号,重定向信号处理函数

#!/bin/sh clean() { killall process 2>/dev/null } trap clean 1 #kill -1 $$ RC=0 while [ $RC -e...
  • l_nan
  • l_nan
  • 2014年09月10日 14:16
  • 1375
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:信号
举报原因:
原因补充:

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