linux中用信号进行进程时延控制
linux延时函数

linux延时函数
Linux内核中包含了一些延时函数,他们被应用在很多情况下,用于
控制系统内部多个线程与进程执行的先后顺序,通常被用来保证数据的正
确性和及时的处理步骤。
Linux下常用的延时函数有:
1、usleep:usleep函数会让调用进程暂停指定的时间,其参数是指
定的暂停时间,以微秒为单位,当暂停时间到达后,就会激活当前的进程。
2、nanosleep:nanosleep函数的参数也是指定的暂停时间,但是精
度比usleep函数更精确,它是以纳秒为单位设定暂停时间,暂停时间到
达后,也会激活当前的进程。
3、sleep:sleep函数被用来暂停调用进程,它的参数以秒为单位,
指定了暂停时间,当暂停时间到达后,就会唤醒当前进程。
4、schedule_timeout():schedule_timeout()函数会指定一个超时
时间,当计时器到达设定时间时,就会激活当前的进程,继续执行后续的
操作。
以上就是Linux常用的延时函数,它们可以精确控制进程执行,保证
数据的正确性和及时处理,它们为Linux内核的设计和提供了一定的便利。
linux中的signal机制

Linux支持的信号列表如下。很多信号是与机器的体系结构相关的,首先列出的是POSIX.1中列出的信号:
信号 值 处理动作 发出信号的原因
----------------------------------------------------------------------
break;
case 2:
printf("Get a signal -- SIGINT ");
break;
(对于SIGSYS,SIGXCPU,SIGXFSZ,以及某些机器体系结构下的SIGBUS,Linux缺省的动作是A (terminate),SUSv2 是C (terminate and dump core))。
下面是其它的一些信号
信号 值 处理动作 发出信号的原因
(1) 与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号。
(2) 与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。
(3) 与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。
收 到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处 理。第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信 号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。
传递给信号处理例程的整数参数是信号值,这样可以使得一个信号处理例程处理多个信号。系统调用signal返回值是指定信号signum前一次的处理例程或者错误时返回错误代码SIG_ERR。下面来看一个简单的例子:
啊嘛18.

●嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统●系统组成部分是嵌入式系统硬件平台、嵌入式操作系统和嵌入式系统应用。
硬件平台为各种嵌入式器件、设备(ARM、PowerPC、Xscale、MIPS);操作系统指在嵌入式硬件平台上运行的操作系统,主流的有嵌入式Linux、μCLinux、WinCE、μC/OS-Ⅱ、VxWorks。
RTOS有QNX,pSOS,vxworks,RT-Linux。
●用户进程:进程控制块、系统堆栈、用户堆栈、程序代码及数据段组成;Linux可管理512个进程,进程调度的police域有:SCHED_OTHER; SCHED_FIFO; SCHED_RR。
进程控制相关的系统调用函数有:fork,exit,vfork,wait,execve。
●五种状态进程状态:①就绪状态TASK_RUNNING 0;②可中断等待状态TASK_INTERRUPTIBLE 1;③不可中断等待状态TASK_UNINTERRUPTIBLE 2;④停止状态、僵尸状态TASK_ZOMBIE 4;⑤中止状态TASK_STOPPED 8。
●从Linux的调度来看,支持非实时(普通)和实时两种进程。
●Linux 虚拟文件系统维护描述整个虚拟文件系统以及实际已挂装的文件系统的数据结构。
常见文件系统:yaffs, jsffs, cramfs。
文件系统安装必须调用mount命令,把其他子系统安装到已经存在于文件系统的空闲节点上。
类型的注册函数为register filesystem,超级用户卸载文件系统使用umount命令。
●交换机制:将不用或暂不用的页框中的页移出,装上新的页面;linux三级分页结构●进程的通信与同步机制有管道、信号、消息队列、共享内存和信号量集等el 中。
Linux 管道有:匿名管道和命名管道;从信号的可靠性方面,信号分为:可靠信号和不可靠信号●linux设备驱动注册基本参数有设备名称,设备驱动的数据结构、设备号和次设备号。
linux系统delay函数 -回复

linux系统delay函数-回复Linux系统中的delay函数旨在实现程序在一定时间内停止执行。
它广泛应用于各种领域,如实时系统、嵌入式系统和网络通信等。
本文将从原理、使用方式以及一些常见问题等方面进行解答,以帮助读者更好地理解和使用delay函数。
一、delay函数的原理delay函数在Linux系统中是由内核提供的一个软件延迟函数。
具体原理是利用循环进行空操作,即不做任何有意义的工作,从而使程序暂停一段时间。
延迟的时间是通过计算循环次数来实现的。
二、使用delay函数1. 头文件引入:使用delay函数前,需要引入头文件<unistd.h>。
2. 函数原型:delay函数的原型为:void delay(unsigned int milliseconds)。
3. 延迟时间设置:参数milliseconds表示需要延迟的毫秒数。
可以根据实际需求进行设置。
4. 调用delay函数:在需要延迟的地方调用delay函数即可。
三、delay函数使用示例下面通过一个简单的示例来演示delay函数的使用方式。
c#include <unistd.h>int main() {延迟500毫秒delay(500);其他操作...return 0;}在上述示例中,程序将会在delay函数的调用处暂停500毫秒,然后继续执行其他操作。
四、delay函数的注意事项1. 精度问题:由于delay函数是通过循环次数来实现延迟的,所以实际延迟的时间可能会和参数设置有一定的误差。
因此,在对延迟时间要求较高的场景中,建议使用更精确的方法。
2. CPU占用:delay函数是通过循环来实现延迟的,因此在延迟期间会占用CPU资源。
如果需要长时间延迟或者需要同时进行其他计算密集型任务,可能会导致系统性能下降。
3. 不适用于实时场景:由于Linux系统的多任务调度机制,delay函数无法保证实时性。
如果需要在实时场景中进行精确的延迟控制,建议使用专门的实时延迟函数。
Linux设备驱动程序学习(10)-时间、延迟及延缓操作

Linux设备驱动程序学习(10)-时间、延迟及延缓操作Linux设备驱动程序学习(10)-时间、延迟及延缓操作度量时间差时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据HZ 值来设定,HZ 是一个体系依赖的值,在<linux/param.h>中定义或该文件包含的某个子平台相关文件中。
作为通用的规则,即便如果知道HZ 的值,在编程时应当不依赖这个特定值,而始终使用HZ。
对于当前版本,我们应完全信任内核开发者,他们已经选择了最适合的HZ值,最好保持HZ 的默认值。
对用户空间,内核HZ几乎完全隐藏,用户HZ 始终扩展为100。
当用户空间程序包含param.h,且每个报告给用户空间的计数器都做了相应转换。
对用户来说确切的HZ 值只能通过/proc/interrupts 获得:/proc/interrup ts 的计数值除以/proc/uptime 中报告的系统运行时间。
对于ARM体系结构:在<linux/param.h>文件中的定义如下:也就是说:HZ 由__KERNEL__和CONFIG_HZ决定。
若未定义__KERNEL__,H Z为100;否则为CONFIG_H Z。
而CONFIG_HZ是在内核的根目录的.config文件中定义,并没有在make menuconfig的配置选项中出现。
Linux的\arch\arm\configs\s3c2410_defconfig文件中的定义为:所以正常情况下s3c24x0的HZ为200。
这一数值在后面的实验中可以证实。
每次发生一个时钟中断,内核内部计数器的值就加一。
这个计数器在系统启动时初始化为0,因此它代表本次系统启动以来的时钟嘀哒数。
这个计数器是一个64-位变量( 即便在32-位的体系上)并且称为“jiffies_64”。
但是驱动通常访问jiffies 变量(unsigned long)(根据体系结构的不同:可能是jiffies_64 ,可能是jiffies_64 的低32位)。
linux中内核延时编程

linux中内核延时编程内核函数 ndelay, udelay, 以及 mdelay 对于短延时好用, 分别延后执行指定的纳秒数, 微秒数或者毫秒数. 它们的原型是:#include <linux/delay.h>void ndelay(unsigned long nsecs);void udelay(unsigned long usecs);void mdelay(unsigned long msecs);有另一个方法获得毫秒(和更长)延时而不用涉及到忙等待. 文件<linux/delay.h> 声明这些函数:void msleep(unsigned int millisecs);unsigned long msleep_interruptible(unsigned int millisecs);void ssleep(unsigned int seconds)前 2 个函数使调用进程进入睡眠给定的毫秒数.一个对 msleep 的调用是不可中断的; 你能确保进程睡眠至少给定的毫秒数. 如果你的驱动位于一个等待队列并且你想唤醒来打断睡眠, 使用msleep_interruptible. 从 msleep_interruptible 的返回值正常地是 0; 如果, 这个进程被提早唤醒, 返回值是在初始请求睡眠周期中剩余的毫秒数. 对ssleep 的调用使进程进入一个不可中断的睡眠给定的秒数.===================================================================== ======#include <linux/kthread.h>#include <linux/module.h>#include <linux/delay.h>//定义使用定时来计时的宏#ifndef SLEEP_MILLI_SEC#define SLEEP_MILLI_SEC(nMilliSec)\do { \long timeout = (nMilliSec) * HZ / 1000; \while(timeout > 0) \{ \timeout = schedule_timeout(timeout); \} \}while(0);#endif#define error(...) do {\printk("********************************************************\ n");\printk("errorlocated %s : %d :%s\n",__FILE__,__LINE__,__FUNCTION__);\printk(__VA_ARGS__);\printk("********************************************************\ n");\}while(0)static struct task_struct * MyThread = NULL;static int MyPrintk(void *data){int i = 0;while (i>-1 ) {if (kthread_should_stop()) {break;}error(" i = %d\n",i);//延时1000毫秒,在延时中一直占用CPU,不适合做长时间的延时,否则会导致内核或者系统出问题//udelay(),ndelay()同理//mdelay(1000);//用定时来延时1000毫秒//SLEEP_MILLI_SEC(1000);msleep(1000);i++;}return 0;}static int __init init_kthread(void){MyThread = kthread_run(MyPrintk,"hello world","mythread");return 0;}static void __exit exit_kthread(void){if(MyThread){printk("stop MyThread\n");kthread_stop(MyThread);MyThread = NULL;}return;}module_init(init_kthread);module_exit(exit_kthread); MODULE_AUTHOR("hyy"); MODULE_LICENSE("GPL");。
linux sigterm信号用法
linux sigterm信号用法在Linux 中,`SIGTERM` 是一种用于终止进程的信号。
当系统管理员或其他进程希望优雅地终止一个运行中的进程时,常常会发送`SIGTERM` 信号。
相对于强制终止信号`SIGKILL`,`SIGTERM` 信号允许进程有机会在接收到信号时完成清理工作。
以下是使用`SIGTERM` 信号的一些常见用法:1. 手动发送`SIGTERM` 信号:```bashkill -15 <PID>```或者更简洁地:```bashkill -TERM <PID>```这会向进程发送`SIGTERM` 信号,其中`<PID>` 是目标进程的进程标识符。
2. 在脚本中使用`kill` 命令:在脚本中,可以使用`kill` 命令发送`SIGTERM` 信号,如下所示:```bash#!/bin/bash# 获取进程PIDPID=$(pidof your_process_name)# 发送SIGTERM信号kill -TERM $PID```3. 处理`SIGTERM` 信号的进程:在编写应用程序时,可以捕获`SIGTERM` 信号,并在接收到信号时执行清理操作。
例如,在使用C 语言编写的程序中,可以使用信号处理函数来处理`SIGTERM` 信号:```c#include <stdio.h>#include <signal.h>#include <unistd.h>void sigterm_handler(int signo) {printf("Received SIGTERM signal. Cleaning up...\n");// 执行清理操作// ...exit(EXIT_SUCCESS);}int main() {// 注册SIGTERM信号处理函数signal(SIGTERM, sigterm_handler);// 业务逻辑while (1) {// ...sleep(1);}return 0;}```在上述示例中,当进程接收到`SIGTERM` 信号时,会执行`sigterm_handler` 函数来进行清理操作,然后正常退出程序。
linux 中的进程处理和控制方式
linux 中的进程处理和控制方式Linux 是一种广泛使用的操作系统,它具有强大的进程处理和控制功能。
在 Linux 系统中,进程是进行任务的基本单位,它们可以同时运行,互相通信,共享资源,因此进程处理和控制是 Linux 系统重要的组成部分。
Linux 提供了多种方式来处理和控制进程。
以下是一些常见的方式:1. 创建新进程:在 Linux 系统中,可以通过 fork() 系统调用创建一个新的子进程。
子进程是通过复制父进程的内存空间、文件描述符和其他资源来创建的。
这样可以实现并行处理任务,提高系统的效率。
创建新进程时,可以使用 exec() 系统调用来加载一个新的程序运行。
2. 进程调度:Linux 使用调度器(scheduler)来决定哪个进程在何时执行。
调度算法会根据进程的优先级(priority)和调度策略来决定进程的执行顺序。
常见的调度策略包括先进先出(FIFO)、最短作业优先(SJF)、轮转(Round Robin)等。
通过合理的调度算法,可以提高系统的响应速度和资源利用率。
3. 进程间通信:在 Linux 中,进程之间可以通过多种方式进行通信。
其中最常用的方式是通过管道(pipe)、信号(signal)和共享内存(shared memory)来进行进程间的数据交换。
管道可以实现进程的单向通信,信号可以用于进程之间的异步通信,而共享内存可以让多个进程共享同一片内存区域,实现高效的数据交换。
4. 进程控制:Linux 提供了多个命令和系统调用来控制进程的行为。
例如,可以使用 ps 命令来查看系统中正在运行的进程,使用kill 命令发送信号终止进程,使用 nice 命令来改变进程的优先级等。
此外,还可以使用进程控制信号(Process Control Signals)来改变进程的状态,如暂停、继续、停止等。
5. 进程管理工具:Linux 提供了一些进程管理工具来帮助用户更方便地处理和控制进程。
Linux命令高级技巧使用kill和pkill终止进程
Linux命令高级技巧使用kill和pkill终止进程Linux操作系统是一种广泛应用于服务器和嵌入式领域的操作系统,其强大的命令行工具使得管理和控制进程变得相对简单。
本文将介绍Linux命令中kill和pkill的高级技巧,帮助用户准确地终止进程。
一、kill命令的基本用法kill命令是Linux系统下用于终止进程的命令,可以通过传递进程ID(PID)或进程名称来选择要终止的进程。
其基本语法如下:```kill [options] PID```其中,PID是进程的ID,options是kill命令的可选参数。
以下是kill命令的一些常用选项:1. -l:列出所有可用的信号名称;2. -s<信号>:指定要发送的信号;3. -<信号>:与-s选项一样,指定要发送的信号。
例如,要终止进程ID为123的进程,可以使用以下命令:```kill 123```二、kill命令的高级技巧1. 使用信号终止进程在Linux中,kill命令默认使用的是SIGTERM信号(编号为15),它会请求进程正常终止。
如果进程未能正常终止,可以尝试使用SIGKILL信号(编号为9),该信号会立即中止进程,不给予进程任何处理机会。
可以通过以下命令发送SIGKILL信号终止进程:```kill -9 PID```请注意,使用SIGKILL信号强制终止进程可能会导致数据丢失或系统不稳定,请谨慎使用。
2. 使用killall命令终止进程killall命令可以根据进程名称终止多个进程,其基本语法如下:```killall [options] 进程名```以下是killall命令的一些常用选项:1. -i:在终止进程之前进行交互确认;2. -s<信号>:指定要发送的信号,默认为SIGTERM;3. --help:显示killall命令的帮助信息。
例如,要终止所有名为"example"的进程,可以使用以下命令:```killall example```三、pkill命令的基本用法pkill命令也可以根据进程名称终止进程,但与killall命令相比,pkill命令更加灵活。
Linux信号在进程控制中的应用
( 济宁 医学院信 息工程 学院, 山东 济宁 26 2 ) 7 86 摘要 : 信号是 Lnx系统中进程之间通信的一种有效方式 , iu 通过信号, 进程问可以传递信息, 同时信号也能在进程的运行过程 但 中起到一定的控制作 用。本文介绍使 用信号相关的系统调用, 设计利用信号控制进程运行的3种模型, 并举例加以分析。
as n y e h m i x mp e . l a a r st e w t e a ls o l s h Ke r s:in ;p o e s c n r l i u ;s se y wo d s a gl rc s o t ;L n x y tm 1 o 1
该 调用 设 置 信号 SG L M 在 经 过 参 数 scn s IA R eod 信号全称为软中断信号 , 也称作软中断 , Lnx 指定 的秒数后发送给 目前的进程。如果参数 s od 是 i u e ns c 系统 中的最古 老 的进 程 问通 讯 方式 。信 号 不但 能从 为 0, 之前设 置 的闹 钟 会被 取 消 , 将 剩 下 的 时 间 则 并 内核发往 一 个 进 程 , 能 从 一 个 进 程 发 往 另 一 个 进 返 回 , 也 如果 之前未设 闹钟则 返 回 0 。 程。信号主要用来通知进程发生 了异步事件 , 只是 2. Si n l 但 2 g a 用来通 知某进 程 发 生 了什 么事 件 , 不 给 该 进 程 传 并 # n l d <sg a . i cu e i 1 h> n 递任何 数 据 J 而 每 个 信 号 往 往 有 其 特 殊 的 含 义 。 , tpdf o ( s hn lrt (n) y ee i i ad ) i ; vd g e t 信号 的名称是 在头 文件 s n1h中定 义 的 J可 以在 i a. g , sg a d e t i a(n s u ih l r gl il i m,s hnl _ ad r ; n sn g n i ade t n l ) g r h e 命令 行下使 用 kl 1 令 查 看 Lnx系 统 支 持 的信 i 命 1. iu s nl i a 系统 调 用 用 来 说 明 对 信 号 的 处 理 方 法 。 g 号 。它们 以 SG开头 , I 例如 : Sgu i m参数用 来 指定 信 号 ,ade 可 以 是信 号 处 理 n hn l r ( ) I A O T: 1 SG B R 表示 进程异 常终止 。 函数或则 两个特殊 值之一 : ( ) I A R 表示超 时警告 。 2 SG L M: ( )I—G 1 SG I N表示 忽略信 号 ; 2 相关 系统 调 用说 明 ( )I F 表示将 信号 恢复 为默认处理 。 2 SG D 1 如果参 数 hnl 是 信 号 处 理 函数 , s a 会 ade r 则 i l n g 在 Lnx iu 系统 中对 信 号 进 行 处 理 需要 通 过很 多 可 系统 调用 来完成 , 现对 比较 常用 的几 个 加 以说 明 , 并 在收到信号后调用该函数, 以形象地称为信号注册 处 理 函数 。 . 通过它们来构造几个对进程控制的模型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux下使用信号进行进程的运行控制
1linux的信号
信号全称为软中断信号,也有人称作软中断,是Linux系统中的最古老的进程间通讯方式。
它们用来向一个或多个进程发送异步事件信号。
信号可以从键盘中断中产生,另外进程对虚拟内存的非法存取等系统错误环境下也会有信号产生。
信号还被shell程序用来向其子进程发送任务控制命令。
2系统调用介绍
2.1 alarm系统调用
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。
如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。
返回之前闹钟的剩余秒数,如果之前未设闹钟则返回0。
2.2Signal
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
signal系统调用用来说明对信号的处理方法。
Signum参数用来指定信号,handler可以
如果是信号处理函数,则signal会在收到信号后调用该函数,我们可以形象的称为信号注册处理函数。
2.3kill系统调用
#include<sys/type.h>
#include<signal.h>
int kill(pid_t pid,int sig);
kill函数用于给进程组或进程发送信号。
pid为目标进程号,sig为要被发送的信号。
发送信号的进程必须和目标进程在同一个进程组,或者发送i信号的进程的拥有者是一个超级用户,另外,进程可以向自己发送信号。
2.4pause系统调用
#include <unistd.h>
int pause(void);
pause函数使调用进程挂起直到有信号递达。
如果信号的处理动作是终止进程,则进程终止,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,pause不返回;如果信号的处理动作是捕捉,则调用了信号处理函数之后pause返回-1,errno设置为EINTR,所以pause只有出错的返回值。
错误码EINTR表示“被信号中断”。
3进程自身时延控制
进程可以利用信号机制来实现对自身运行状态的控制。
以下示例程序就是利用alarm()系统调用来时间程序对自身运行时间的控制。
#include <stdio.h>
#include <unistd.h>
#include<sys/types.h>
#include<signal.h>
void sig_alrm1(int);
void sig_alrm2(int);
void func();
int main(void)
{
signal(SIGALRM,sig_alrm1)
//用来注册SIGALRM信号的处理函数
alarm(5);/*SIGALRM会在经过5秒数后发送给当前的进程*/
func(); /*进程转去处理函数func()*/
return 0;
}
void sig_alrm1(int signo){
/*SIGALRM信号处理函数,来处理程序中设置的第一个signal()系统调用*/
printf("the SIGALRM signal is cathced,and is processed by sig_alrm1\n");
printf("the function overtime,an the procress will be quit!\n");
_exit(0);
}
void sig_alrm2(int signo){
/*SIGALRM信号处理函数,来处理程序中设置的第二个signal()系统调用*/
printf("In a specified timethe function completed!\n");
printf("And signal_alrm2 deal with the SIGALRM signal!\n");
_exit(0);
}
void func(){/*需要进行时间控制的函数*/
printf("A function is running now!\n");
for(;;)
pause();
signal(SIGALRM,sig_alrm2);
}
运行程序:
A function is running now!
/*程序运行时会在着停留5秒钟*/
the SIGALRM signal is cathced,and is processed by sig_alrm1
the function overtime,an the procress will be quit!
程序说明:
程序u先用signal()声明了SIGALRM信号处理函数为sig_alrm1(),设置了时钟alarm()来对程序的运行进行时间控制,alarm系统调用的参数是5,则进程会在5秒钟后受到内核发送给自己的SIGALRM信号。
然后进程调用一个函数func(),如果函数func()不能在5秒钟内结束,则进程会在收到SIGALRM信号后调用sig_alarm1函数。
如果函数func()在5秒钟内结束,则函数会在最后执行语句signal(SIGALRM,sig_alrm2),将信号SIGALRM的处理函数改为sig_alrm2,而后一次signal系统调用会覆盖前一次signal系统调用的效果。
4进程间的运行控制
进程利用信号不仅可以进行自身的控制,同样可以控制另外一个进程
#include<stdio.h>
#include <unistd.h>
#include<sys/types.h>
#include<signal.h>
#include<stdlib.h>
#include<sys/wait.h>
static pid_t pid;
void sig_alrm(int);
int main(void){
pid_t wait_pid;
int status;
if((pid=fork())<0){
perror("Cannot create the new process");
return 1;
}
else if(pid==0){
sleep(25);
_exit(0);
}
else
{
printf("Child process ID:%d\n",pid);
signal(SIGALRM,sig_alrm); /*说明对信号SIGALRM的处理方法为sig_alrm函数*/
alarm(10);
pause();
}
while((wait_pid=wait(&status)) && wait_pid!=-1){ /*用来显示子进程结束的原因*/
if(WIFSIGNALED(status))
printf("process id:%d Receive SIG :%d exit\n",pid,WTERMSIG(status));
if(WIFEXITED (status))
printf("process id:%d exit code %d\n",pid,WEXITSTA TUS(status));
}
return 0;
}
void sig_alrm(int sig)
{ /*信号处理函数*/
kill(pid,SIGKILL);
}
运行程序:
Child process ID:5714
/*中间间隔10秒钟*/
process id:5714 Receive SIG :9 exit
程序说明:程序利用fork()产生一个子进程,并在父进程中用signal()说明了信号处理方法为sig_alrm,即当SIGALRM信号到来后,父进程会调用sig_alrm函数来对子进程进行处理,在sig_alrm函数中给子进程发送了SIGKILL信号,杀死了子进程。
结语:
以上简单的介绍了信号和对信号处理的基本动作,由于信号的种类多和用户可以定义自己的处理函数,这样用户不仅可以做时延控制,还可以对各种事件做出相应处理。