上一节介绍进程间通信方式之一信号通信中的信号产生和捕捉函数,这一节介绍信号处理函数signal()函数和信号集函数组,接上一节http://blog.csdn.net/mybelief321/article/details/9078193
强烈建议做最后一个实验!
信号处理方法
信号处理的方法主要有以下两种:
① 使用 signal() 函数;
② 使用信号集函数组。
使用signal()函数
函数说明
使用signal()函数处理时,只需指出要处理的信号和处理函数即可。它主要用于前32种非实时信号的处理,不支持信号传递信息。Linux还支持一个更健壮更新的信号处理函数呢,它就是 sigaction(),推荐使用这个函数。
函数格式
这里 signal() 这个函数的原型我当时看了头有点大,还是先说明一下:首先该函数原型整体指向一个无返回值并且带一个整形参数的函数指针,也就是信号的原始配置函数;接着该原型又带有两个参数,其中第2个参数可以是用户自定义的信号处理函数的函数指针。不明白也没事,后边做实验就明白了,会用就行了。
这里要说明的是 sigaction()函数中第2个和第3个参数用到的 sigaction 结构,下表为 siaction的定义:
sa_handler 是一个函数指针,指定信号处理函数,这里除可以是咱们自定义的处理函数外,还可以为SIG_DFL(采用默认的处理方式)或SIG_IGN(忽略信号)。它的处理函数只有一个参数,即信号值。
sa_mask 是一个信号集,它可以指定在信号处理程序执行过程中哪些信号应当被屏蔽,在调用信号捕获函数前,该信号集要加入到信号的信号屏蔽字中。
sa_flags 中包含了很多标志位,是对信号进行处理的各个选择项。它的常见可选值如下表所示:
‘
基础实验1
本实验是表明如何使用 signal()函数捕捉相应信号,并做出给定的处理。这里,my_func就是信号处理的函数指针,咱们也可以将其改为SIG_IGN或SIG_DFL查看运行结果。实验代码如下:
signal.c文件点此下载
编译运行后出现如下的结果:
此时程序被挂起,一直等待信号。
如果在键盘上按下 Ctrl+c 组合键,结果如下
如果在键盘上按下 Ctrl+\ 组合键,结果如下
可见进程收到相应的信号后,转去执行咱们自定义函数了。你可以将my_func换为SIG_IGN或者SIG_DFL,看看有什么不同。
基础实验2
本实验实现的功能同实验1一样,只不过是换成了sigaction()函数,程序如下
sigaction.c文件点此下载
编译运行后结果如下
第一次按组合键“Ctrl+c”,结果如下
第二次按组合键“Ctrl+c”,结果如下
我建议你把25行的换成SA_RESTARTHAND等试一试,会加深理解的
信号集函数组
函数说明
使用信号集函数组处理信号时设计一系列的函数,这些函数按照先后的调用次序可分为以下几大模块:创建信号集、注册信号处理函数及检测信号。
其中,创建信号集主要用于处理用户感兴趣的一些信号,其函数包括以下几个:
● sigemptyset(): 将信号集初始化为空
● sigfillset(): 将信号集初始化为包含所有已定义的信号集
● sigaddset(): 将指定信号加入到信号集中
● sigdelset(): 将指定信号从信号集中删除
● sigismember(): 查询指定信号是否在信号集中
注册信号处理函数主要用于决定进程如何处理信号。这里要注意的是,信号集里的信号并不是真正可以处理的信号,只有当信号的状态处于非阻塞状态时才会真正起作用。因此,首先使用 sigprocmask() 函数检测并更改信号屏蔽字(信号屏蔽字是用来指定当前被阻塞的一组信号,它们不会被进程接收),然后使用 sigaction()函数来定义进程接收到特定信号后的行为。
检测信号是信号处理的后续步骤,因为被阻塞的信号不会传递给进程,所以这些信号就处于“未处理”状态(也就是进程不清除它的存在)。sigaction()函数允许进程检测“未处理”信号,并进一步决定对它们做何处理。
函数格式
在sigprocmask()中,若set 是一个非空指针,则参数 how 表示函数的操作方式;若how为空,则表示忽略此操作。
总之,在处理信号时,一般遵循下图所示的操作流程
基础实验3(强烈建议做这个实验啊)
该实验首先把 SIGQUIT、SIGINT两个信号加入信号集,然后将该信号集设为阻塞状态,并进入用户输入状态。咱们只需要按任意键,就可以将信号集设置为非阻塞状态,再对这两个信号分别操作,其中SIGQUIT执行默认操作,而SIGINT执行用户自定义函数的操作。
sigset.c文件点此下载
编译运行结果如下
按任意键
接着按组合键:Ctrl+c
接着按组合键:Ctrl+\
如果在运行时,先直接按组合键:Ctrl+\,结果如下
对比结果可以看到,在新号处于阻塞状态时,所发出的信号对进程不起作用,并且该信号进入待处理状态。按下任意键,信号脱离了阻塞状态时,咱们发出的信号才能正常运行。这里SIGINT已经按照咱们自定义的函数运行。
转自请注明出处:http://blog.csdn.net/mybelief321/article/details/9079145
相关推荐
2. 信号(Signal):信号是 Linux 中的一种异步通信机制,它允许一个进程发送信号给另一个进程,以通知其发生了某种事件。信号可以是同步的或异步的,可以用于不同进程之间的通信。 3. 消息队列(Message Queue):...
### Linux进程间通信与同步详解 #### 一、概述 在多任务操作系统中,进程间通信与同步机制是解决进程间数据交换与资源共享的关键技术。这些机制确保了多个并发运行的任务能够有效地协作,并且避免了资源冲突。对于...
Linux的进程通信机制源自UNIX,融合了AT&T的System V IPC和BSD的套接字机制。UNIX IPC主要包括管道、FIFO和信号,System V IPC涉及消息队列、信号量和共享内存,而Posix IPC对应Posix消息队列、信号量和共享内存。...
### Linux 进程间通信之软中断信号机制详解 #### 一、软中断信号概述 在Linux系统中,进程间通信(IPC)是一项基础而重要的技术。其中,**软中断信号**作为进程间通信的一种机制,它允许进程之间或者进程与内核...
实验 Linux 进程通信的参考答案展示了 Linux 中进程通信的机制和方式,包括信号机制、管道通信机制和多进程并发执行。这些机制和方式是 Linux 编程中非常重要的概念,了解它们对于编写高效、可靠的程序非常重要。
Linux进程间通信是一种让不同进程之间交换信息或协调工作的方式,而在Linux系统中,信号(Signal)是一种简单但重要的通信机制。本文将深入探讨如何利用信号进行进程间通信。 首先,信号是操作系统用来通知进程发生...
在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是多个进程间相互协作、交换数据的关键机制。本文将详细讲解一种常见的IPC方式——信号(Signal)通信,特别是其中的定时信号(Timed Signal)...
- **System V IPC**:这是由AT&T贝尔实验室开发的一组进程间通信工具,主要用于单个计算机内的进程间通信。它包括三种基本类型的IPC机制:消息队列、信号量和共享内存。 - **BSD Socket**:由加州大学伯克利分校的...
在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是实现多个进程协同工作的重要手段。其中,信号(Signal)是一种轻量级、异步的通信方式,它允许一个进程向另一个进程发送一个通知,表明某个...
信号是Linux系统中用于进程间通信的一种轻量级机制,它允许一个进程向另一个进程发送一个消息,告知接收进程发生了某种事件或需要执行某个动作。信号通信具有快速、简单的特点,但同时也存在信息量有限和同步能力较...
提供的两份文档《7.0_Linux进程间通讯_上.pdf》和《7.1_Linux进程间通讯_下.pdf》将详细阐述上述各种通信机制,并可能包含实例代码和实践指导,对于深入理解和掌握Linux进程间通信非常有帮助。 总结,Linux进程间...
Unix环境下,进程间通信手段基本上是从平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力:贝尔实验室和加州大学伯克利分校,两者在进程间通信方面的侧重点不同。贝尔实验室对早期的进程间通信...
Linux提供了多种进程间通信方式,包括管道(Pipe)、有名管道(FIFO)、消息队列(Message Queue)、信号量(Semaphore)、共享内存(Shared Memory)、套接字(Socket)以及信号(Signal)等。接下来,我们将详细...
在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是多个进程之间共享数据、交换信息的关键技术。本文将深入探讨Linux进程间通信的多种方法、原理以及实际应用。 一、管道(Pipe) 管道是一种...
本次实验是关于操作系统中的进程通信,主要涉及了进程的创建、控制、以及多种通信方式,包括信号通信和管道通信。通过实验,目的是加深对进程概念的理解,掌握并发执行的本质,并学习如何解决进程间的互斥问题。实验...
进程间通信是操作系统中多进程协作的基础,它包括了管道、信号量、共享内存、消息队列、套接字等多种机制。这些机制允许不同进程之间交换数据,实现同步和协调。在这些源代码中,我们可以看到这些通信方式的实际...
**信号(Signal)**是另一种进程间通信机制,用于通知接收进程发生了某种事件。信号可以中断进程的正常执行流程,处理特定的中断情况。例如,当进程接收到`SIGINT`(中断信号)时,通常会终止运行。在Linux中,可以...
### Linux进程间通信详解 #### 一、进程间通信概述 进程间通信(Inter-Process Communication,简称IPC)是指在不同的进程之间交换数据或者协调进程的行为。Linux操作系统提供了多种进程间通信的方式,使得进程间...
【linux】信号-进程间通信的方式signal