Linux信号处理1

函数原型

NAME
       signal - ANSI C signal handling

SYNOPSIS
       #include <signal.h>

       typedef void (*sighandler_t)(int);

       sighandler_t signal(int signum, sighandler_t handler);

signal函数具有注册功能,什么事都不干。只是告诉系统,当来信号signum时,按handler的方式处理。只有来信号时,才会调用这个函数。信号不来,永远不会调用这个函数。

用户能够通过输入CTRL+c、Ctrl+\,或者是终端驱动程序分配给信号控制字符的其他任何键来请求内核产生信号。

ctrl + c  --> 2)SIGINT
ctrl + \  --> 3)SIGQUIT

以上两者都可以让程序退出。

代码

/*************************************************************************
    > File Name: hello.c
    > Author: KrisChou
    > Mail:[email protected]
    > Created Time: Mon 25 Aug 2014 09:25:15 AM CST
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <assert.h>
#include <signal.h>
#include <sys/select.h>

void handler(int num)
{
    printf("sig_num: %d \n", num);
}
int main(int argc, char* argv[])
{
    char buf[1024];
    signal(2, handler);
    int iret ;
    fd_set read_set, ready_set ;
    FD_ZERO(&read_set);
    FD_SET(0, &read_set);
    while(1)
    {
        ready_set = read_set ;
        iret = select(1, &ready_set, NULL, NULL, NULL);
        if(iret == 0)
        {
            continue ;
        }else if(iret == -1)
        {
            perror("select");
            continue ;
        }else
        {
            iret = read(0, buf, 1024);
            buf[iret] = ‘\0‘;
            write(1, buf, strlen(buf));
        }
    }

程序运行后先按ctrl+c,结果如下:

[[email protected] review]$ gcc test.c
[[email protected] review]$ ./a.out
^Csig_num: 2
select: Interrupted system call
hello world!
hello world!

由于SIGINT已经通过signal(2, handler);进行注册了, 因此很显然当按下ctrl+c后,信号处理函数handler自然会捕捉到这个信号,因此会显示^Csig_num: 2 。

而select函数 会处理中断信号。收到中断信号,会返回-1。 因此显示select: Interrupted system call select 。

注意:select函数在3中情况下会返回,分别是:轮询时间到点会返回。收到信号会返回。描述符有活动会返回。

(顺带补充下:read 是 阻塞函数,收到信号时先处理信号, 接着继续等。)

之后程序运行就很显然了。有输入,select返回1,输入什么,就打印什么。按ctrl+d,select返回0,程序继续运行。

时间: 2024-12-25 00:46:05

Linux信号处理1的相关文章

linux 信号处理 二

[摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执行及注销等.最后介绍了应用层的相关处理,主要包括信号处理函数的安装.信号的发送.屏蔽阻塞等,最后给了几个简单的应用实例. [关键字]软中断信号,signal,sigaction,kill,sigqueue,settimer,sigmask,sigprocmask,sigset_t 1       信

linux信号处理相关知识

因为要处理最近项目中碰上的多个子进程退出信号同时到达,导致程序不当产生core的情况,今天我花了时间看了一些关于linux信号处理的博客. 总结一下:(知识未经实践) 1 1 linux信号分两种,一种实时信号(也叫可靠信号),一种非实时信号(也叫不可靠信号). 2 2 实时信号之所以是可靠的,因为在进程阻塞该信号的时间内,发给该进程的所有实时信号会排队,而非实时信号则会合并为一个信号.(可以这样理解,同一个不可靠信号同时产生时,只有一个信号会被处理,其它的丢弃) 3 3 早期设计的信号都是不可

linux 信号处理

前言 Linux中的信号是向进程异步发送的事件通知,通知进程有事件(硬件异常.程序执行异常.外部发出信号)发生.当信号产生时,内核向进程发送信号(在进程所在的进程表项的信号域设置对应于该信号的位).内核处理一个进程收到的信号的时机是在一个进程从内核态返回用户态时,当一个进程在内核态运行时,软中断信号并不立即起作用,要等到将返回用户态时才处理,进程只有处理完信号才会返回用户态,进程在用户态下不会有未处理完的信号.内核为每个进程维护一个(未处理)的信号队列,信号产生后首先被放入到未决队列中,如果进程

linux 信号处理 四

一.信号生命周期 从信号发送到信号处理函数的执行完毕 对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生:信号在进程中注册完毕:信号在进程中的注销完毕:信号处理函数执行完毕.相邻两个事件的时间间隔构成信号生命周期的一个阶段. 下面阐述四个事件的实际意义: 信号"诞生".信号的诞生指的是触发信号的事件发生(如检测到硬件异常.定时器超时以及调用信号发送函数kill()或sigqueue()等). 信号在目标

linux 信号处理 一

信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断.从它的命名可以看出,它的实质和使用很象中断.所以,信号可以说是进程控制的一部分. 一.信号的基本概念 本节先介绍信号的一些基本概念,然后给出一些基本的信号类型和信号对应的事件.基本概念对于理解和使用信号,对于理解信号机制都特别重要.下面就来看看什么是信号. 1.基本

linux 信号处理 三

一.信号及信号来源 信号本质 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达. 信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了.信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息. 信号来源 信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它

linux信号处理时机

信号号称所谓软中断,事实上,还是没有真正的硬件中断那样能随时改变cpu的执行流 硬件中断之所以能一发生就得到处理是因为处理器在每个指令周期的结尾都会去检查中断,这种粒度是很细的 但是信号的实现只是在进程的task_struct里面有一个成员用于标识当前收到了哪些信号? 而这个成员的检查显然只能在特定时间点:从内核模式返回到用户模式的时候 可以想象,当进程从一个硬件中断中返回.从系统调用中返回或者正在休眠或者刚刚得到了调度,都是从内核态返回用户态的时机 这时候就会检查pending signals

Linux信号处理2

引言 先看以下两个信号量: 13)SIGPIPE     当管道读端关闭,再往管道写东西,会发出SIGPIPE信号 17)SIGCHLD   子进程退出会向父进程发出SIGCHLD信号,系统默认处理是忽略掉该信号 代码 /************************************************************************* > File Name: my_fork.c > Author: KrisChou > Mail:[email prote

Linux信号处理

给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取.这些信息包括子进程的进程ID.终止状态以及资源利用信息(CPU时间,内存使用量等等).如果一个进程终止,而该进程有子进程处于僵尸状态,那么它的所有僵尸子进程的父进程ID将被重置为1(init进程).继承这些子进程的init进程将清理它们(init进程将wait它们,从而去除僵尸状态). 但通常情况下,我们是不愿意留存僵尸进程的,它们占用内核中的空间,最终可能导致我们耗尽进程资源.那么为什么会产生僵尸进程以及如何避免产生僵尸