1.信号处理之:kill(),alarm(),pause()函数



1查看信号的方式:man
7 signal,通过这个命令可以查看到所有信息。

2查看信号kill
-l

注意,后面的32个信号表示的实时信号。

会发现一个规律,前32种信号会有各种不同的名称,后32种会以“SIGRTMIN”或者“SIGRTMAX”开头,前者是从unix继承下来的信号,称为不可靠信号(也称为非实时信号),后者为了解决“不可靠信号”的问题进行了更改和扩充的信号形成了可靠信号(也称为实时信号)

如果想要了解可靠与不可靠信号,需要了解信号的生命周期:

一个完整的信号周期可以分为三个重要阶段,三个重要阶段有四个重要事件刻画的:信号产生,信号在进程中注册,信号在进程中注销,执行信号处理函数

相邻的两个事件的时间间隔构成了生命周期的一个阶段,这里的信号处理有多种方式,一般由内核完成,也可以由用户进程完成

3.man 7 signal

Signal dispositions

Each signal has a current disposition,which determines how the process

behaves when it is delivered the signal.

The entries  in 
the "Action"  column of thetables below specify the

default disposition for each signal, asfollows:

Term  Default action is to terminate the process. 
表示终止当前线程

Ign   Default action is to ignore the signal.
表示忽略该信号

Core  Default action is to terminate the process and 
dump core  (see

core(5)). 表示终止当前进程并且Core Dump(Core Dump用于gdb调试)

Stop  Default action is to stop the process.
表示停止当前进程

Cont  Default  action 
is to  continue the process if it iscurrently

stopped. 表示继续执行先前停止的进程。

信号产生种类:

Ctrl+C  
SIGINT

Ctrl+z  
SIGTSTP

Ctrl+\  
SIGQUIT

4.硬件异常

*除0操作

*访问非法内存

int kill(pid_tpid,int sig)

pid > 0

sig发送给ID为pid的进程

pid < 0

sig发送给组ID为|pid|的进程,并且发送进程具有向其发送信号的权限

pid == -1

sig发送给发送进程有权限向他们发送信号的系统上的所有进程为0时,用于检索,特定pid进程是否存在,如不存在,返回-1

kill函数的语法格式:

raise()函数(自己向自己发送信号)语法要点:

下面的例子使子进程不在父进程调用kill之前不退出,然后父进程调用kill使子进程退出:

运行结果:

当去掉24行时,运行的结果是:

5.alarm()、pause()

函数说明

alarm()也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它就向进程发送SIGALARM信号。要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm()之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。

pause()函数用于将调用进程挂起直至捕捉到信号为止。这个函数很常用,通常可以用于判断信号是否已到。

函数格式

本实验上是完成一个简单的sleep()函数的功能,程序如下图

运行结果:

注释第9行

运行结果:

上面一闪而得出结果。

分析:程序定时时,执行到第9行pause()时,进程会被挂起,当计时到,发送信号SIGALARM,这时pause()捕捉到信号,进程直接被终止。

再如通过alarm实现打印计数:

运行结果:

时间: 2024-10-18 15:48:21

1.信号处理之:kill(),alarm(),pause()函数的相关文章

10.10 alarm以及pause函数

alarm函数pause函数ExampleExampleExampleExample alarm函数 alarm函数允许我们设置一个在未来的某一时刻终止的定时器,当定时器终止的时候,SIGALRM信号就被发出,如果我们忽略或者不捕获这一信号的话,该信号的默认行为是终止进程. #include <unistd.h> unsigned int alarm(unsigned int seconds); Returns:0 or number of seconds until previously s

linux中alarm函数和pause函数详解实例

alarm(time);执行之后告诉内核,让内核在time秒时间之后向该进程发送一个定时信号,然后该进程捕获该信号并处理:pause()函数使该进程暂停让出CPU,但是该函数的暂停和前面的那个sleep函数的睡眠都是可被中断的睡眠,也就是说收到了中断信号之后再重新执行该进程的时候就直接执行pause()和sleep()函数之后的语句:下面是一个定时2秒的实例: /*******************************************************************

10.9 kill以及raise函数

kill函数用于发送信号给一个进程或者是一个进程组,函数raise允许进程发送一个信号给自身. raise函数最开始定义与ISO C中,POSIX.1为了与兼容ISO C标准,于是包含了函数raise,但是POSIX.1将函数raise的特性扩展到了线程处理(我们将在12.8中讨论线程是如何与信号发生交互的),因为ISO C并不处理多进程,它并不能定义向kill这样的函数,因为kill函数需要使用一个进程ID的参数. #include <signal.h> int kill(pid_t pid

cocos2dx中node的pause函数(lua)

time:2015/05/14 描述 lua下使用node的pause函数想暂停layer上的所有动画,结果没有效果 1. pause函数 (1)cc.Node:pause 代码: void Node ::pause () { _scheduler-> pauseTarget(this ); _actionManager-> pauseTarget(this ); _eventDispatcher-> pauseEventListenersForTarget(this ); } 分析:

信号处理篇alarm ferror kill mkfifo pause pclose perror pipe popen sigaction sigaddset sigdelset sigemptyset signal sleep strerror

alarm(设置信号传送闹钟) 相关函数 signal,sleep 表头文件 #include<unistd.h> 定义函数 unsigned int alarm(unsigned int seconds); 函数说明 alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程.如果参数seconds 为0,则之前设置的闹钟会被取消,并将剩下的时间返回. 返回值 返回之前闹钟的剩余秒数,如果之前未设闹钟则返回0. 范例 #include<unistd.h

UNIX环境编程学习笔记(25)——信号处理进阶学习之 sigaction 函数

lienhua342014-11-05 sigaction 函数跟 signal 函数一样,用于设置信号处理函数.此函数是用于取代 UNIX 早期版本使用的 signal 函数.UNIX 早期版本的 signal 函数在捕获到一个信号之后,就会自动将该信号的处理动作恢复为默认处理动作.于是,如果我们希望注册的信号处理函数长期生效,则需要在信号处理程序中再次调用 signal 函数注册一次.这样的操作太麻烦,而且在信号处理函数中再次调用 signal 注册信号处理函数之前可能又会产生该信号,而这个

定时器的使用和原理浅析,alarm/sleep函数

alarm,select,sleep函数 内核需要做的时间管理: 1)提供系统调度所使用的tick中断 2)维护系统时间 3)维护软件定时器,高速tcp和多媒体应用要使timer高效精准 为了更好的支持音视频等需求,提出了hrtimer这个高精度时钟子系统,为了节约能源,采用了tickless子系统.

Linux信号、信号处理和信号处理函数

信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据. 一.信号的来源 信号的来源可以有很多种试,按照产生条件的不同可以分为硬件和软件两种. 1.  硬件方式 当用户在终端上按下某键时,将产生信号.如按下组合键后将产生一个SIGINT信号. 硬件异常产生信号:除数据.无效的存储访问等.这些事件通常由硬件(如:CPU)检测到,并将其通知

进程挂起函数pause

探讨一下pause函数的用法: 1 #include<stdio.h> 2 #include<signal.h> 3 #include<unistd.h> 4 void signhand(int signo) 5 { 6 int i; 7 for(i=0;i<10;i++) 8 { 9 printf("signhand number is %d\n",i); 10 sleep(1); 11 } 12 } 13 int main() 14 { 1