`
king_tt
  • 浏览: 2084113 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Linux下的signal信号机制

 
阅读更多

在Linux中,要发送一个信号相当容易。程序员需要知道两个信息:要发送哪个信号,将这个信号发送给哪个进程。可以用 man 7 signal 找到一个可以利用的信号的列表。用户可以只将信号发送给用户自己的进程,也可以以root身份运行从而将信号发送给任意一进程。

Source:

Result:

[work@db-testing-com06-vm3.db01.baidu.com c++]$ ./signal_test

程序已经开始运行,5秒钟后将接收到时钟信号。

距离SIGALRM信号到来还有5秒。

系统接收到了SIGIO信号。

距离SIGALRM信号到来还有4秒。

距离SIGALRM信号到来还有3秒。

距离SIGALRM信号到来还有2秒。

系统接收到了用户自定义信号SIGUSR1。

距离SIGALRM信号到来还有1秒。

5秒钟时间已到,系统接收到了SIGALRM信号!

子进程还剩2秒退出,届时会产生SIGCHLD信号。

子进程还剩1秒退出,届时会产生SIGCHLD信号。

收到SIGCHLD信号,表明我的子进程已经中止,SIGCHLD信号的数值是:17。

------此时程序会停下来等待,请按下ctrl+c送出SIGINT信号-------

已经接收到了SIGINT信号,程序将退出!

信号参考对照表:

Signal

Description

SIGABRT

由调用abort函数产生,进程非正常退出

SIGALRM

alarm函数设置的timer超时或setitimer函数设置的interval timer超时

SIGBUS

某种特定的硬件异常,通常由内存访问引起

SIGCANCEL

Solaris Thread Library内部使用,通常不会使用

SIGCHLD

进程TerminateStop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略

SIGCONT

当被stop的进程恢复运行的时候,自动发送

SIGEMT

和实现相关的硬件异常

SIGFPE

数学相关的异常,如被0除,浮点溢出,等等

SIGFREEZE

Solaris专用,Hiberate或者Suspended时候发送

SIGHUP

发送给具有TerminalControlling Process,当terminaldisconnect时候发送

SIGILL

非法指令异常

SIGINFO

BSD signal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程

SIGINT

Interrupt Key产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程

SIGIO

异步IO事件

SIGIOT

实现相关的硬件异常,一般对应SIGABRT

SIGKILL

无法处理和忽略。中止某个进程

SIGLWP

Solaris Thread Libray内部使用

SIGPIPE

reader中止之后写Pipe的时候发送

SIGPOLL

当某个事件发送给Pollable Device的时候发送

SIGPROF

Setitimer指定的Profiling Interval Timer所产生

SIGPWR

和系统相关。和UPS相关。

SIGQUIT

输入Quit Key的时候(CTRL+/)发送给所有Foreground Group的进程

SIGSEGV

非法内存访问

SIGSTKFLT

Linux专用,数学协处理器的栈异常

SIGSTOP

中止进程。无法处理和忽略。

SIGSYS

非法系统调用

SIGTERM

请求中止进程,kill命令缺省发送

SIGTHAW

Solaris专用,从Suspend恢复时候发送

SIGTRAP

实现相关的硬件异常。一般是调试异常

SIGTSTP

Suspend Key,一般是Ctrl+Z。发送给所有Foreground Group的进程

SIGTTIN

Background Group的进程尝试读取Terminal的时候发送

SIGTTOU

Background Group的进程尝试写Terminal的时候发送

SIGURG

out-of-band data接收的时候可能发送

SIGUSR1

用户自定义signal 1

SIGUSR2

用户自定义signal 2

SIGVTALRM

setitimer函数设置的Virtual Interval Timer超时的时候

SIGWAITING

Solaris Thread Library内部实现专用

SIGWINCH

Terminal的窗口大小改变的时候,发送给Foreground Group的所有进程

SIGXCPU

CPU时间限制超时的时候

SIGXFSZ

进程超过文件大小限制

SIGXRES

Solaris专用,进程超过资源限制的时候发送

==========================================================================

signal学习推荐:


信号(signal)介绍(Linux中国)

http://www.linux-cn.com/html/linux/system/20070505/27605.shtml

Linux 信号signal处理函数(CSDN)

http://blog.csdn.net/Sunboy_2050/archive/2010/10/16/5945535.aspx

Linux 信号signal处理机制(CSDN)

http://blog.csdn.net/Sunboy_2050/archive/2010/10/16/5945380.aspx

==========================================================================
程序员可以调用 int raise(int signo) 将一个信号发送给它自己。这个函数只带有一个参数,既要发送信号的编号。如:raise(SIGINT); raise(SIGKILL);
让人感兴趣的是函数 unsigned int alarm(unsigned int seconds) 它可以让用户进程在将来某个指定的时间接收到一个信号。alarm()的唯一参数是将来信号SIGALRM应该在多少秒以后发送给用户进程。当用户调用alarm()时,前面任何一个请求的报警信号(不包括悬挂起来被阻塞的SIGALRM信号)都将被取消,调用的返回值是前面请求的剩余时间。alarm()范例如下:

if(signal(SIGALRM,alarmhandler)==SIG_ERR)
{
printf("Couldn't register signal handler./n");
}
alarm(5); // 5秒钟以后,程序将会收到一个SIGALRM信号
for(i=0;i<10;i++)
{
sleep(3);
}
void alarmhandler(int signum)
{
printf("alarmhandler./n");
}

也可以使用 int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue) 来实现更精确更方便的定时控制。
参数which一般取ITIMER_REAL,它使得用户的计时器根据系统时钟来计算时间。当计数时间到期时,它将发送一个SIGALRM信号。其功能和alarm()一样,所以用户不能将两者同时使用。
结构itimerval的定义如下:
struct itimerval
{
struct timeval it_interval; // 每一次触发报警后应该被复位的值,为0报警被禁止
struct timeval it_value; // 下一次触发报警的时间,为0报警将只触发一次
};
结构timeval的定义如下:
strut timeval
{
long tv_sec; // 秒数
long tv_usec; // 微秒数
};
setitimer()范例如下:

struct itimerval itimer;
itimer.it_interval.tv_usec = 0; // it_interval字段指定了每一次触发后应该被复位的值
itimer.it_interval.tv_sec = 2;

itimer.it_value.tv_usec = 0; // it_value字段指定了直到下一次触发的时间
itimer.it_value.tv_sec = 5;
setitimer(ITIMER_REAL,&itimer,NULL);

for(i=0;i<10;i++)
{
sleep(3);
}

void alarmhandler(int signum)
{
printf("alarmhandler./n");
}

分享到:
评论

相关推荐

    Linux 信号signal处理机制

    Linux 信号signal处理机制,Linux 信号signal处理机制

    Linux 信号signal处理机制.docx

    Linux 信号signal处理机制.docx

    Linux信号signal处理机制[参考].pdf

    Linux信号signal处理机制[参考].pdf

    linux信号机制和signal

    信号是Linux编程中非常重要部分本文将详细介绍信号机制基本概念、Linux对信号机制大致实现思路方法、如 何使用信号以及有关信号几个系统

    linux进程间通信——信号机制

    对linux信号机制的详细阐述,包括signal,sigaction等函数的用法,并配以实例,通俗易懂,适合初学者阅读。。。

    Linux信号(signal)机制.rar

    Linux,系统,内幕,编程

    信号量机制实验

    编写一段程序,使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进 程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号...

    3操作系统实验.doc

    实验一:信号机制 实验目的 1、了解什么是信号 2、熟悉LINUX系统中进程之间软中断通信的基本原理 实验内容 1、编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键...

    LINUX环境高级编程 第五章 信号

    信号的概念 signal函数 不可靠信号与可靠信号 信号的发送接收机制 信号集与可靠信号机制 sigsetjmp和siglongjmp函数 abort函数

    Linux内核中的信号机制??信号发送

    应用程序发送信号时,主要通过kill进行。注意:不要被“kill”迷惑,它并不是发送SIGKILL信号专用函数。这个函数主要通过系统调用sys_kill()进入内核,它接收两个参数:  第一个参数为目标进程id,kill()可以向...

    深入分析Linux内核源码.chm

    7.2 信号(signal) 7.3 System V 的IPC机制 第八章 虚拟文件系统 8.1 概述 8.2 VFS中的数据结构 8.3 高速缓存 8.4 文件系统的注册、安装与拆卸 8.5 限额机制 8.6 具体文件系统举例 8.7 文件系统的系统调用 8 .8 Linux...

    linux下几种最常用的IPC接口,这样一来,统一了接口,提高代码重用性.rar

    linux除了支持Unix早期信号语义函数signal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);...

    Linux内核中的信号机制??信号处理

    当进程被调度时,会调用do_notify_resume()来处理信号队列中的信号。信号处理主要是调用sighand_struct结构中对应的信号处理函数。do_notify_resume()(arch/arm/kernel/signal.c)函数的定义如下: asmlinkage void...

    QT的信号与槽机制介绍

    信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。 QT是一个跨平台的C GUI应用构架,它提供了丰富的窗口部件集,具有面向...

    Linux内核中的信号机制–从用户层到内核层

    注册信号主要用来确定信号值及进程针对该信号值的动作之间的映射关系,即进程将要处理哪个进程和该信号被传递给进程时,将执行何种操作。主要有两个函数实现信号的注册:signal()和sigaction()。  2、signal() ...

    深入分析Linux内核源码

    7.2 信号(signal) 7.2.1 信号种类 7.2.2 信号掩码 7.2.3 系统调用 7.2.4 典型系统调用的实现 7.2.5 进程与信号的关系 7.2.6 信号举例 7.3 System V 的IPC机制 7.3.1 信号量 7.3.2 消息队列 7.3.3 共享内存...

    基于linux下QT平台完成的简单图书馆管理系统.zip

    Qt提供了信号和槽机制用于完成见面操作的响应,是完成任意两个Qt对象之通信机制。其中,信号会在某个特定情况或动作下被触动,槽是等同于接受并处理信号的函数。 为什么方法不是直接调用的。中间用到 Signal 和槽...

    操作系统实验:进程通信与进程同步(CTGU)

    (1)编写程序,使用Linux操作系统中的信号量机制模拟实现生产者-消费者问题。设有一个生产者和一个消费者,缓冲区可以存放产品,生产者不断生成产品放入缓冲区,消费者不断从缓冲区中取出产品,消费产品。

Global site tag (gtag.js) - Google Analytics