linux信号解释(4)--C语言下的理解

上一节中中简单介绍了信号的处理机制,就是调用函数库来实现信号的处理,因此,在这节中,介绍在C语言下如何理解信号的处理机制。

创建一个文件signal.c,文件内容如下:(对于学过一下C语言的童鞋来说是不是很熟悉呢)

#include<signal.h> //信号函数库
#include<unistd.h> //C和C++语言提供对POSIX
#include<stdio.h> //标准的输入输出库
void signalout(int signo) //自定义signalout函数,用于处理signal函数的参数
{
        switch(signo)
        {
                case 1: //信号1SIGHUP
                printf("Get a signal -- SIGHUP\n");
                break;
                case 2: //信号SIGINT
                printf("Get a signal -- SIGINT\n");
                break;
                case 3: //信号SIGQUIT
                printf("Get a signal -- SIGQUIT\n");
                break;
                default:
                printf("error\n");
                break;
        }
}
int main()
{
        printf("process ID is %d\n",getpid()); //调用unistd.h函数库中的getpid函数获取当前进程ID
        signal(1,signalout); //写法有两种,一种是写信号数字
        signal(SIGINT,signalout); //另一种写法是写信号名称
        signal(SIGQUIT,signalout); //调用前面自定义的signalout函数处理信号
        for(;;); //写一个死循环,目的是使这个进程一直在运行,以便捕捉信号
        return 0;
}

题外讲解,signal()函数:
函数原型:
void (signal(int signum,void( handler)(int)))(int) 或 typedef void (*sig_t)( int ) 或 sig_t signal(int signum,sig_t handler)
参数说明:
第一个参数signum指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号
第二个参数handler描述了与信号关联的动作,它可以取以下三种值:
(1)一个无返回值的函数地址
此函数必须在signal()被调用前申明,handler中为这个函数的名字。当接收到一个类型为signum的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义:
void func(int sig);
(2)SIG_IGN
这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。
(3)SIG_DFL
这个符号表示恢复系统对信号的默认处理。

保存编辑的文件后执行#gcc signal.c -o signal,编译生成可执行二进制文件signal。(在这里我们就学习了如何在linux下进行C语言编写啦^_^)

接着我们运行二进制文件#./signal

在另外一个terminal中发送信号

目前按ctrl+c是无法终止当前进程的了。想要终止进程只能通过SIGKILL信号来实现(因为之前说过SIGKILL和SIGSTOP信号是无法被捕捉的嘛)
#kill -9 22822

原文地址:http://blog.51cto.com/lythjq/2083083

时间: 2024-11-13 11:24:42

linux信号解释(4)--C语言下的理解的相关文章

linux信号解释(2)

笔者学识不深,以下内容是网上摘取,以便日后使用. 信号 信号详细描述 简明描述 处理方式 1) SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联. 连接挂断 终止(默认处理) 2) SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程. 终端中断,Ctrl+c产生该信号 终止(terminate) 3) SI

linux信号解释(5)--bash下的理解

上一节中用了C语言来理解信号的处理,那么在bash中是如何理解的呢? 首先我们来认识一下trap命令#type trapo_o原来是一个shell的内建命令,大家能想想为何是内建命令吗?sh是人机对话的接口,我们发起的命令都会通过sh与内核进行打交道,那么在当前sh进程内就能及时完成信号的捕捉和处理. 好了我们回到bash中如何理解呢?我们还是用回上一节的实例来做,创建一个signalshell.sh文件,文件内容如下: #!/bin/bash # echo "Process ID is $$&

linux信号解释(3)--信号处理机制

如果需要进程捕获某个信号,并作出相应的处理,就需要注册信号处理函数(其实就是内核里需要识别信号函数,类似C语言里的include某函数库). 处理信号就类似软中断,内核为每个进程准备了一段信号向量表,记录信号的处理机制.当某个信号发生后,内核就会调用注册的函数去处理. 信号何时来,是未知的,因此进程不可能一直等待信号来.信号的接收不是有用户进程来完成,需要内核来代理.当用户进程P2向另一个进程P1发送信号后,内核接收到信号,将信号放置P1进程的信号队里中.当P1进程进入内核态时,会检查信号队列,

关键字static在c语言下的理解

用static关键字声明一个变量的作用是: 1.用static声明局部变量,则将把变量分配在静态存储区,该变量在整个程序执行期间不释放,为其分配的空间始终存在. 2.用static声明全局变量,则该变量的作用域只限于本文件模块,即使用extern声明也不能使用.

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

信号分类 不可靠信号 Linux信号机制基本上是从UNIX系统中继承过来的.早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号的响应设置为默认动作.在某些情况下,将导致对信号的错误处理:因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号. 2.因此导致, 早期UNIX下的不可靠信号主要指的是进程可能对信号做出错误的反应以及信号可能丢失. Linux支持不可靠信号,但是对不可

Linux信号机制

信号分类 不可靠信号 VS. 可靠信号 Linux信号机制基本上是从UNIX系统中继承过来的.早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号的响应设置为默认动作.在某些情况下,将导致对信号的错误处理:因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号. 2.早期UNIX下的不可靠信号主要指的是进程可能对信号做出错误的反应以及信号可能丢失. Linux支持不可靠信号,但是

Linux编译多个不同目录下的文件以及静态库、动态库的使用

先看两篇博文,作为基础知识.如果对C/C++编译链接过程都了解的话,可以跳过不看. http://www.firedragonpzy.com.cn/index.php/archives/2556 http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html 一.  编译不同目录下的多个文件 各个文件的布局如下: head.h文件的代码: [cpp] view plaincopy #ifndef  HEAD_H #define  HEAD

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

linux信号基本概念及如何产生信号 摘自:https://blog.csdn.net/summy_j/article/details/73199069 2017年06月14日 09:34:21 阅读数:4131 标签: linux信号 更多 个人分类: Linux 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/summy_J/article/details/73199069 阅前须知 本文的主要内容有: 1.信号的基本概念(包括进程对信号的3

Linux信号使用及自定义信号

linux自定义信号:https://www.cnblogs.com/bigben0123/p/3186661.html linux信号.值及解释:https://blog.csdn.net/luotuo44/article/details/16799607 信号处理:https://wiki.jikexueyuan.com/project/cplusplus/signal-handling.html 没什么kill -l没有32 33 http://www.kbase101.com/quest