Author:ce123(http://blog.csdn.net/ce123)
信号机制是类UNIX系统中的一种重要的进程间通信手段之一。我们经常使用信号来向一个进程发送一个简短的消息。例如:假设我们启动一个进程通过socket读取远程主机发送过来的网络数据包,此时由于网络因素当前主机还没有收到相应的数据,当前进程被设置为可中断等待状态(TASK_INTERRUPTIBLE),此时我们已经失去耐心,想提前结束这个进程,于是可以通过kill命令想这个进程发送KILL信号,内核会唤醒该进程,执行它的信号处理函数,KILL信号的默认处理是退出该进程。当然并不是一定要进程处于TASK_INTERRUPTIBLE状态时才能够处理信号。
另外应用程序可以通过signal()等函数来为一个信号设置默认处理函数。例如当用户按下CTRL+C时,shell将会发出SIGINT信号,SIGINT的默认处理函数是执行进程的退出代码,但是下面的例子把SIGINT的响应函数设置为int_handler。
- #include
- #include
-
- void int_handler(int signum)
- {
- printf("\nSIGINT signal handler.\n");
- printf("exit.\n");
- exit(-1);
- }
-
- int main()
- {
- signal(SIGINT, int_handler);
- printf("int_handler set for SIGINT\n");
-
- while(1)
- {
- printf("go to sleep.\n");
- sleep(60);
- }
-
- return 0;
- }
当执行上面这段代码时,先执行main函数,设置SIGINT的处理函数,并进入睡眠状态,进程进入可中断等待状态:
按下CTRL+C后,进程会被唤醒执行SIGINT的处理函数int_handler()这个函数,进程会退出。
· 信号的分发和处理是在内核态进行的,当从上面的例子中可以看书,信号的处理函数可能是在用户态,在这种情况下,内核需要内核态构建一个临时的用户态环境,然后调用用户态的信号处理函数。
关键字:linux内核 信号机制
引用地址:
linux内核中的信号机制--一个简单的例子
推荐阅读最新更新时间:2024-03-16 14:45
基于S3C2440的Linux内核移植和yaffs2文件系统制作-- 配置Linux内核
1.3.3 配置Linux内核 1、 进入Linux-2.6.29.1内核主目录,通过以下命令将2410的默认配置文件写到当前目录下的.config。S3C2410的配置和S3C2440差不多,,在这基础上进行修改。 make s3c2410_defconfig 2、 配置内核模块的功能,有几种方式可以进行界面选择: make menuconfig(文本选单的配置方式,在有字符终端下才能使用) make xconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用) make oldconfig(文本配置方式,在原内核配置的基础修改时使用) 这里使用make menuconfi
[单片机]
基于S3C2440的Linux内核移植和yaffs2文件系统制作--启动系统
第三章 启动系统 将前面两章生成的内核映像文件和根文件系统映像文件下载到mini2440开发板,查看启动信息。我成功移植启动信息如下: VIVI version 0.1.4 ( root@capcross ) (gcc version 2.95.3 20010315 (release)) #0.1.4 Mon Oct 27 10:18:15 CST 2008 MMU table base address = 0x33DFC000 Succeed memory mapping. DIVN_UPLL0 MPLLVal CLKDIVN:5h +------------------------------------------
[单片机]
linux内核中的文件描述符(四)--fd的分配--get_unused_fd
Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.csdn.net/ce123) 在linux内核中主要有两个函数涉及到文件描述符的分配:get_unused_fd和locate_fd。本文主要讲解get_unused_fd,将会在下一篇文章中介绍locate_fd。首先给出get_unused_fd的定义(fs/open.c): view plain copy print ? int get_unused_fd(void) { struct files_struct * files = curre
[单片机]
BootLoader与Linux内核的参数传递
在嵌入式系统中,BootLoader 是用来初始化硬件,加载内核,传递参数。因为嵌入式系统的硬件环境各不相同,所以嵌入式系统的BootLoader 也各不相同,其中比较通用的是U-Boot,它支持不同的体系结构,如ARM,PowerPC,X86,MIPS 等。本文着重介BootLoader与内核之间参数传递这一基本功能。本文的硬件平台是基于AT91RM9200 处理器系统,软件平台是Linux-2.6.19.2 内核。内核映像文件为zImage。 1. 系统硬件平台简介 AT91RM9200 处理器,它是由Atmel 公司基于ARM920T 内核的微处理器,带有内存管理单元,CPU 时钟最高可达240MHz,它具有丰
[单片机]
关于ARMv8另外几个问题
问题1:支持ARMv8的Linux内核异常向量地址在哪? 答:异常向量基地址在0xffffffc000081800。通过查看编译后的linux内核的System.map文件,能确定异常向量表的基地址。通过反汇编生成的支持armv8的linux内核也可以证实。Armv8的异常向量表的定义在内核的arch/arm/kernel/entry.S中,将其摘录如下: /* * Exception vectors. */ .macro ventry label .align 7 b label .endm .align 11 ENTRY(vectors)
[单片机]
嵌入式Linux内核调试技术
近年处理器技术发展速度加快,嵌入式领域发生了翻天覆地的变化。特别是网络的普及,消费电子异军突起,嵌入式与互联网成为最热门的技术。在所有操作系统中,Linux是发展很快、应用很广泛的一种操作系统。Linux的开放性以及其他优秀特性使其成为嵌入式系统开发的首选。 嵌入式系统开发所面临的问题 嵌入式软件开发有别于桌面软件系统开发的一个显著的特点是,一般需要一个交叉编译和调试环境,即编辑和编译软件在主机上进行,编译好的软件需要下载到目标机上运行 ,主机和目标机之间建立起通讯连接,并传输调试命令和数据。由于主机和目标机往往运行着不同的操作系统,而且处理器的体系结构也彼此不同,这就提高了嵌入式开发的复杂性。 总的来说,嵌入式开发所面临的问题
[嵌入式]
Linux内核2.6.25全新发布加入众多新特性
经过两个多月的不断完善,最新的Linux内核2.6.25刚刚正式发布了,此次发布的新版kernel加入了众多重要新特性,主要包括: 进程组内存资源控制器 基于2.6.24中加入的“Control Groups”,将一组任务的内存行为同系统的其它部分分离开来,可以被用来: ·隔离一个或者一组程序,内存饥渴型程序可以被限制在更小的空间中。 ·利用一块受限的内存空间建立一个cgroup,可以代替启动时使用mem=XXXX选项。 ·可以更好的控制虚拟化软件。 ·CD/DVD刻录机可以控制系统剩余内存,防止由于内存不足刻录失败的情况发生。 实时分组调度 基于2.6.24中引入的组调度(Group Schedulin
[工业控制]