`
king_tt
  • 浏览: 2232242 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Linux进程间通信(四)---信号通信之信号发送捕捉kill()、raise()、alarm()、pause()及其基础实验

阅读更多

信号概述

● 信号是在软件层次上对中断机制的一种模拟。在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。

● 信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上进程也不知道信号到底什么时候到达。

● 信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一个进程,而无需知道该进程的状态。如果该信号当前并未处于执行态(Running),则该信号由内核保存起来,直到该进程恢复执行再传递给它为止。如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事件发生了。信号机制除了基本通知外,还可以传递附加信息。

信号来源

信号事件发生的来源有两种:

① 硬件来源。如我们按下了键盘上的按钮 或者出现其他硬件故障;

② 软件来源。最常用发送信号的系统函数有kill()、raise()、alarm()、setitimer()和sigqueue()等,软件来源还包括一些非法运算等操作。

进程响应信号的方式

① 忽略信号。忽略信号即对信号不做处理,其中,有两个信号不能忽略:SIGKILL和SIGSTOP。

② 捕捉信号。定义信号处理函数,当信号发生时,执行响应的处理函数。

③ 执行默认操作。Linux对每种信号都规定了默认操作,如下表所示:

 

信号的生命周期

一个完整的信号生命周期可以分为3个重要阶段,这3个阶段由4个重要事件来刻画的;信号产生、信号在进程中注册、信号在进程中注销、执行信号处理函数。这里信号的产生、注册、注销等是指信号的内部实现机制,而不是信号的函数实现(不受我们的掌控)。因此信号注册与否与后面讲到的发送信号函数(如 kill()等)及信号安装函数(如 signal()等)无关,只与信号值有关。

相邻两个事件的时间间隔构成信号生命周期的一个阶段,如下图1.注意这里的信号处理有多种方式,一般是由内核完成的,当然也可以由用户进程来完成。

信号的处理包括信号的发送、捕捉和处理,它们有各自相对应的常见函数:

● 发生信号的函数: kill()、raise()。

● 捕捉信号的函数: alarm()、pause()。

● 处理信号的函数: signal()、sigaction()。

本节主要讲信号的发送与捕捉,下一节再讲处理

信号发送函数 kill()和raise()

函数说明

kill()函数同咱们的kill系统命令一样(但不能误以为kill()就是kill哈),可以发送信号给进程或进程组(实际上,kill系统命令只是kill()函数的一个用户接口)。这里需要注意的是,kill()函数不仅可以终止进程(实际上是通过发出SIGKILL信号终止),也可以向进程发送其他信号。

与kill()函数不同的是,raise()函数允许进程向自身发送信号。

函数格式

下表分别列出了kill()和raise()的格式

 

基础实验

本实验首先使用 fork()创建了一个子进程,接着为了保证子进程不在父进程调用kill()之前退出,在子进程中使用raise()函数向自身发送 SIGSTOP信号,使子进程暂停。接下来在父进程中调用kill()向子进程发送信号,在该实验中使用的是SIGKILL。实验代码如下:

kill_raise.c文件点此下载

编译后执行的效果如下图

你瞧瞧,多狠啊,都不让子进程输出第22行的话,直接啪的就给人拍那里了。

另外,建议你去掉27行的代码再执行一遍试一试看看有什么不同。

信号捕捉函数: alarm()、pause()

函数说明

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

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

函数格式

 

 

基础实验

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

编译执行后,结果如下图

可以看到12行的语句根本就没执行,其实想想程序的执行流程就很清除,首先程序定时,执行到11行pause();时进程会被挂起,当计时到,发出信号SIGALARM,这时pause()捕捉到信号,进程直接被终止。

现在屏蔽掉11行,如下

再次编译执行,结果如下图

下一节学习一下信号的处理,如需转载,请注明出处:http://blog.csdn.net/mybelief321/article/details/9078193

最后,顺祝大家端午节快乐!!也顺祝今年的金九银十顺利!

分享到:
评论

相关推荐

    进程间通信

    - 在进程间通信中,常常需要同步(如`pause()`、`alarm()`配合使用)和互斥(锁机制)来避免数据竞争和死锁问题。 综上所述,进程间通信涉及多种机制,包括信号、管道、有名管道和消息队列。这些机制都有其特点和...

    linux信号专题笔记.docx

    #### 信号发送 Linux提供了多种方式来发送信号: - **`kill()`函数**:发送信号给指定进程。 - **`raise()`函数**:向调用进程发送信号。 - **`pause()`函数**:使进程挂起直到接收到信号。 - **`alarm()`函数**:...

    linux下系统编程函数大全

    本文将详细介绍 Linux 下常用的信号处理函数及其用法,包括 `alarm`、`kill`、`pause` 和 `sigaction` 等。 #### 二、信号处理函数详解 ##### 1. `alarm` **函数原型**: ```c #include unsigned int alarm...

    信号处理函数解析,signal ,sleep,raise等等函数的使用

    信号处理函数解析,signal,sleep,raise 等函数的使用 ...alarm 函数用于设置信号 SIGALRM,kill 函数用于传送信号给指定的进程,pause 函数用于让进程暂停直到信号出现,sigaction 函数用于查询或设置信号处理方式。

    《操作系统》实验报告(4).doc

    操作系统实验报告第四部分主要关注进程管理和进程间的通信。实验涵盖了几个关键知识点,包括进程的互斥、同步、信号通信以及进程的创建与控制。以下是详细解释: 1. **进程管理**: - **进程同步**:确保多个进程...

    进程同步.docx

    2. 信号产生产生信号的最常用系统函数是 kill、raise、alarm、setitimer 和 abort 函数。 kill 函数向其他进程发送信号。Raise 函数向当前进程发送信号,原型为: `#include int raise(int sig);` 参数: * sig...

    UNIX环境高级编程部分

    - **kill/raise函数**:发送信号给进程。 - **alarm/pause函数**:设置定时器和暂停进程。 - **信号集**:一组信号。 - **sigprocmask函数**:阻塞或解除阻塞信号。 - **sigpending函数**:检查待处理信号。 - **...

    Linux系统编程学习笔记

    - **函数 kill/raise/alarm/pause**: `kill` 用于发送信号给进程或线程,`raise` 用于向调用进程发送信号,`alarm` 设置一个定时器,`pause` 则使进程暂停直到接收到信号。 - **漏桶/令牌桶和令牌桶封装**: 这些...

    《操作系统》实验报告(4).pdf

    操作系统实验报告主要涉及了进程管理和进程间的通信,包括互斥访问和软中断信号的使用。在实验中,学生需要理解和掌握一系列与操作系统相关的概念和技术。 首先,实验目标旨在让学生熟悉和运用诸如`lockf()`、`kill...

    Linux系统API

    6. **信号处理**:`raise()`发送信号给进程,`kill()`向进程或进程组发送信号,`pause()`暂停进程直到收到信号。 7. **进程间通信**:`pipe()`创建管道,`fifo()`创建命名管道,`shmget()`和`shmat()`处理共享内存...

    APUE读书笔记《UNIX环境高级编程第二版》

    - `raise()`发送信号给调用进程。 **9. alarm和pause** - `alarm()`设置定时器发送信号。 - `pause()`挂起进程直到收到信号。 **10. 信号集及其处理函数** - 使用`sigprocmask()`、`sigsuspend()`管理信号屏蔽。 ...

    UNIX环境高级编程_第2版.part1

     关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在  此基础上介绍了多个应用实例,包括如何创建数据库函数库以及如何与网络打印机通信等。此外,还在附  录中给...

    UNIX环境高级编程_第2版.part2

     关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在  此基础上介绍了多个应用实例,包括如何创建数据库函数库以及如何与网络打印机通信等。此外,还在附  录中给...

    LinuxC_API .doc

    - `kill()`, `raise()`: 发送信号给进程。 - `sigaction()`, `sigaddset()`, `sigdelset()`, `sigemptyset()`, `sigfillset()`: 信号处理函数和集合操作。 - `sigpending()`, `sigprocmask()`: 检查待处理信号和...

    我的APUE2读书笔记

    `kill`和`raise`函数可以发送信号给进程。 **9. alarm和pause** `alarm`用于设定定时器,`pause`用于暂停进程直到接收到信号。 **10. 信号集及其处理函数** 信号集是一组信号的集合。 **11. sigaction函数** `...

    《Linux系统编程、网络编程》第6章 信号

    课程内容:学习本章的意义、Linux下都有哪些信号、signal函数、子进程对父进程信号的集成情况、kill、raise、alarm、pause、abort函数、信号休眠函数的唤醒、信号的发送、接收和处理的过程、如何调用API修改信号的...

    UNIX环境高级编程_第二版中文

    10.10 alarm和pause函数  10.11 信号集  10.12 sigprocmask函数  10.13 sigpending函数  10.14 sigaction函数  10.15 sigsetjmp和siglongjmp函数  10.16 sigsuspend函数  10.17 abort函数  10.18 ...

    中文第一版-UNIX环境高级编程

    10.10 alarm和pause函数 214 10.11 信号集 219 10.12 sigprocmask 函数 220 10.13 sigpending函数 222 10.14 sigaction函数 223 10.15 sigsetjmp 和siglongjmp函数 226 10.16 sigsuspend函数 229 10.17 abort函数 ...

Global site tag (gtag.js) - Google Analytics