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

Linux进程间通信(五)---信号通信之signal()、信号集函数组及其基础实验

阅读更多

上一节介绍进程间通信方式之一信号通信中的信号产生和捕捉函数,这一节介绍信号处理函数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

分享到:
评论

相关推荐

    【linux】信号-进程间通信的方式signal

    【linux】信号-进程间通信的方式signal

    linux进程间通信——信号机制

    对linux信号机制的详细阐述,包括signal,sigaction等函数的用法,并配以实例,通俗易懂,适合初学者阅读。。。

    实验一 进程通信——管道和信号实验报告.doc

    3.(3)进程间信号通信 4.(4)进程的管道通信 编写程序,创建两个子进程。当此程序运行时,系统中有一个父进程和两个子进程。父进程在屏幕上显示“Parent”,子进程分别在屏幕上显示“Child1”和“Child2”。 ...

    linux实验五 进程间通信实验

    1、编写一段程序,使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进 程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到...

    Linux进程间通信–使用信号

    但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获。 二、信号的种类 信号的名称是在头文件signal.h中定义的,信号都以SIG开头,...

    进程通信----软中断

    使用系统调用fork()创建两个子程序,再用系统调用signal()接收父进程从键盘上来的中断信号(即按Ctrl+c键);当有中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程有信号后分别输出 Child ...

    操作系统实验进程的软中断通信

    1[实验题目]  进程的软中断通信 2[实验目的]  (1)理解掌握软中断的概念和技术;... (2)若子进程向父进程发送信号,父进程接到信号后可以缺省操作、或忽视信号、或执行一函数,各是什么含义?

    操作系统课程设计-信号通信与进程控制

    (3)进程通信:①软中断通信;②在程序中使用语句signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。 (4)软中断的捕获与重定义。首先定义一个服务函数function,然后利用signal(sig,...

    操作系统实验:进程通信与进程同步(CTGU)

    ■实验4.1 进程通信实验 (1)理解进程间通信的概念和方法 (2)掌握常用的 Linux 进程间通信的方法 ■实验4.2 进程同步实验 (1)加强对进程同步和互斥的理解,学会使用信号量解决资源共享问题。 (2)熟悉Linux 进程同步...

    linux-ipcs:Linux进程间通信(Inter-Process Communication)方式汇总

    其中信号(signal)和信号量(semaphore)本质上并不算是进程间通信方式,应该是进程间同步的方式,但是也可以起到一定的通信作用,故也列在上面。 另外普通的mutex是作用线程间同步用的,但是可以将进程A和进程B共享的...

    Linux 信号signal处理机制

    Linux 信号signal处理机制,Linux 信号signal处理机制

    linux实现软中断通信和管道通信报告(含代码)

    使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上发出的中断信号(即按delete键),当父进程接收到这两个软中断的某一个后,父进程用系统调用kill()向两个子进程分别发出整数值为16和17...

    Python中的进程间通信

    文章目录Python中的进程间通信1 进程间通信1.1 概念1.2进程间通信方法各种进程间通信1. 基于信号量(Semaphore)的IPC2 基于信号(Signal)的IPC3.基于管道(Pipe)的IPC4. 基于有名管道(fifo)的IPC5.基于消息队列...

    Linux环境进程间通信技术

    IPC是指能在两个进程间进行数据交换的机制.现代OS都对进程有保护机制.因此两个进程不能直接交换数据,必须通过一定机制来完成

    信号通信机制 signal

    信号通信机制 kill(p1,sig1)是用来发送信号sig1给进程pid为p1的子进程。 signal(SIGINT,stop); 作用是:在进程pcb里注册一个软中断标记,用以接收键盘中断。 *****针对实验中的不同情况 分析如下*****

    Linux-signal

    Linux-signal

    (修改版)实现进程的软中断通信。要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断

    使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: ...

    通信系统中的多采样率信号处理(Multirate Signal Processing for Communication Systems)

    通信系统中的多采样率信号处理(Multirate Signal Processing for Communication Systems);多速率dsp经典之作

    对Python信号处理模块signal详解

    Python中对信号处理的模块主要是使用signal模块,但signal主要是针对Unix系统,所以在Windows平台上Python不能很好的发挥信号处理的功能。 要查看Python中的信号量,可以使用dir(signal)来查看。 signal.signal() 在...

Global site tag (gtag.js) - Google Analytics