使用信号实现进程间的通信

在fork那篇博客中,子进程结束后,父进程要回收,避免僵死进程。但是使用waitpid会停止当前的工作,等待有信号或者子进程结束。父进程做自己的事,可以用子进程可以通过信号,在子进程结束时想父进程发一个通知信号,通知父进程可以回收子进程了。首先来看信号的使用,一篇师兄写的很好的文章。一、什么是信号用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管
摘要由CSDN通过智能技术生成

fork那篇博客中,子进程结束后,父进程要回收,避免僵死进程。但是使用waitpid会停止当前的工作,等待有信号或者子进程结束。

父进程做自己的事,可以用子进程可以通过信号,在子进程结束时想父进程发一个通知信号,通知父进程可以回收子进程了。

首先来看信号的使用,一篇师兄写的很好的文章。


一、什么是信号
用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。

信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获。

二、信号的种类
信号的名称是在头文件signal.h中定义的,信号都以SIG开头,常用的信号并不多,常用的信号如下:

更多的信号类型可查看附录表。

三、信号的处理——signal函数
程序可用使用signal函数来处理指定的信号,主要通过忽略和恢复其默认行为来工作。signal函数的原型如下:
[cpp]  view plain   copy
  print ?
  1. #include <signal.h>  
  2. void (*signal(int sig, void (*func)(int)))(int);  
这是一个相当复杂的声明,耐心点看可以知道signal是一个带有sig和func两个参数的函数,func是一个类型为void (*)(int)的函数指针。该函数返回一个与func相同类型的指针,指向先前指定信号处理函数的函数指针。准备捕获的信号的参数由sig给出,接收到的指定信号后要调用的函数由参数func给出。其实这个函数的使用是相当简单的,通过下面的例子就可以知道。注意信号处理函数的原型必须为void func(int),或者是下面的特殊值:
    SIG_IGN:忽略信号
    SIG_DFL:恢复信号的默认行为

说了这么多,还是给出一个例子来说明一下吧,源文件名为signal1.c,代码如下:
[cpp]  view plain   copy
  print ?
  1. #include <signal.h>  
  2. #include <stdio.h>  
  3. #include <unistd.h>  
  4.   
  5. void ouch(int sig)  
  6. {  
  7.     printf("\nOUCH! - I got signal %d\n", sig);  
  8.     //恢复终端中断信号SIGINT的默认行为  
  9.     (void) signal(SIGINT, SIG_DFL);  
  10. }  
  11.   
  12. int main()  
  13. {  
  14.     //改变终端中断信号SIGINT的默认行为,使之执行ouch函数  
  15.     //而不是终止程序的执行  
  16.     (void) signal(SIGINT, ouch);  
  17.     while(1)  
  18.     {  
  19.         printf("Hello World!\n");  
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值