一起talk C栗子吧(第八十四回:C语言实例--使用信号进行进程间通信一)



各位看官们,大家好,上一回中咱们说的是进程间通信的例子,这一回咱们说的例子是:使用信号进行进程间通信。闲话休提,言归正转。让我们一起talk C栗子吧!

我们在上一回中提到过进程之间通信需要解决的三个问题,时间不长,我想大家都记得。今天我们就来解决第一个问题:进程之间如何进行通信

信号的概念

在解决问题前,我们先介绍一下信号。信号是Unix/Linux系统提供的一种机制,它本质上一种软件中断。信号为我们提供了一种异步的事件处理方法,当进程收到信号时就会采取某种操作。例如,当进程收到终止信号(SIGKILL)时就会终止进程。这点我们在介绍进程结束时做过相关的说明。

系统为信号定义了名字,我们可以通过名字来使用信号,信号名字是以SIG开头的字符串。比如,SIGKILL,SIGINT等。

信号的产生

要使用信号进行进程间的通信,首先需要产生信号,信号可以通过以下几种方式来产生:

  • 1.用户使用终端按键时发出信号。比如按下ctrl+c会发出中断信号:SIGINT;
  • 2.硬件有异常时会发出信号。比如使用无效的内存;
  • 3.软件符合某种条件时会发出信号。比如闹钟时钟超时后会发出SIGALRM信号;
  • 4.使用kill命令主动发送信号;

信号的处理

进程收到信号后会做相应的处理,具体有以下几种处理方式:

  • 1.忽略信号。该处理方式就是收到信号后什么也不做,自己总在休息;
  • 2.执行系统对信号定义的默认动作。该处理方式就是收到信号后把它交给系统去处理,自己在一边休息;
  • 3.捕捉信号。这种处理方式就是收到信号后做一些相关的处理,至于做什么处理,需要用户去实现;

明白信号的这些知识后,我们就正式开始介绍使用信号这种方式进行通信。 我们举一个简单的例子进行说明。

编译下面的程序并且运行:

int main
{
    int i = 0;
    while(i++ < 9999)
    {
        printf("i have been sleeping for %d second \n",i);
        sleep(1);
    }

    return 0;
}

下面是程序的运行结果,请大家参考:

./s                                  //在终端中运行编译后的程序
i have been sleeping for 1 second    //程序在运行,并且输出运行结果
i have been sleeping for 2 second
i have been sleeping for 3 second
i have been sleeping for 4 second
i have been sleeping for 5 second
i have been sleeping for 6 second
i have been sleeping for 7 second
i have been sleeping for 8 second
i have been sleeping for 9 second
i have been sleeping for 10 second
^C                                   //在终端中按下ctrl+c终止程序运行

通过上面的程序, 我们分析一下程序中进程通信的原理

  • 把在终端中运行的程序当作进行A,终端本身当作进程B。
  • 在进行B中通过按键给进程 A发送SIGINT信号;
  • 进程B收到该信号后做出了响应:停止运行。我们在进程B中可以看到进程A停止了运行。

看官们,我们后面的章回中还会举其它进程之间通信的例子,以便让大家对使用信号进行进程之间通信有更加深入的了解。

各位看官,关于使用信号进行进程间通信的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


时间: 2024-08-06 15:58:06

一起talk C栗子吧(第八十四回:C语言实例--使用信号进行进程间通信一)的相关文章

一起talk C栗子吧(第八十五回:C语言实例--使用信号进行进程间通信二)

各位看官们,大家好,上一回中咱们说的是使用信号进行进程间通信的样例,这一回咱们接着上一回的内容,继续说该样例.闲话休提.言归正转. 让我们一起talk C栗子吧. 我们在上一回中举了使用信号进行进程间通信的样例,在该样例中.我们通过终端发出信号.当进程收到该信号后让它运行系统对信号定义的默认动作.这一回.我们再来举一个使用信号进行进程间通信的样例,只是.我们发送和处理信号的方式和上一回的样例不一样.在接下来的样例中,我们在一个进程中使用kill产生信号.在另外一个进程中接收而且依照自己的方式处理

一起talk C栗子吧(第十四回:C语言实例--循环链表)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们说的是单链表链式存储列的例子,这一回咱们说的例子是:循环链表. 看官们,循环链表也是链表的一种,只不过该链表的头部和尾部相连接,所以构成了一个循环链,因此叫 作循环链表.让我们一起对比一下单链接与循环链表的不同之处:单链表的尾结点哪里也没有指,因为它 的next指针值为空.循环链表的尾结点指向了它的头结点. 看官们,正文中就不写代码了,详

一起talk C栗子吧(第十二回:C语言实例--单链表一)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们没有说具体的例子,而且是说了例子中的文件组织结构.这一回咱们继续说C例子, 说的例子是链表,更准确的说法叫作单链表.咱们不但要说C例子,而且会在例子中使用上一回中说过的 文件组织结构,就当作是举例说明文件组织结构的使用方法. 有点一石二鸟的感觉,哈哈. 链表定义 看官们,所谓的链表其实就是一组元素通过一定的方式链接在一起.比如我们坐的火车

一起talk C栗子吧(第二十二回:C语言实例--队列一)

各位看官们,大家好,上一回中咱们说的是表达式求值的例子,该例子使用了栈,这一回咱们说的是栈的 兄弟:队列.闲话休提,言归正转.让我们一起talk C栗子吧! 我们在这里说的队列是一种抽象的数据结构,大家不用想的太抽象了,哈哈,其实它和我们日常生活中所 见的队列一样.不管怎么样,我们还是举一个容易理解的例子:大家在假期出去旅游的时候,都有过排队 买门票的经历吧.游客们在售票点的窗口前排成了一长串队列,售票人员先把门票卖给排在队列前面的游 客,买到门票的游客拿着门票兴高采烈地离开了队列,刚来到售票点

一起talk C栗子吧(第二十四回:C语言实例-顺序查找)

各位看官们,大家好,上一回中咱们说的是与队列相关的例子,这一回咱们说的例子是:顺序查找.闲话 休提,言归正转.让我们一起talk C栗子吧! 看官们,在编写程序中,我们经常需要查找我们想要元素.就好比你想要在互联网中查找什么东西时,肯 定会使用百度或者google去搜索. 查找是最常用使用的功能,我们今天就来说说查找的方法:顺序查找.为了让大家容易理解查找方法,我 们把查找的范围限定为某些容器,这些容器可以是我们前面说过的链表,栈,队列 .查找的内容就是这些 容器中的某个元素. 有了我们约定的这

JVM【第十四回】:【回收方法区】

很多人认为方法区(或者HotSpot虚拟机中的永久代)是没有垃圾收集的,Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾手机,而且在方法区进行垃圾收集的"性价比"一般比较低:在堆中,尤其是在新生代中,常规应用进行一次垃圾收集一般可以回收70%~90%的空间,而永久代的垃圾收集效率远低于此. 永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类.回收废弃常量与回收Java堆中的对象非常类似.以常量池中字面量的回收为例,假如一个字符串"abc"已经进入了常

一起talk C栗子吧(第八十七回:C语言实例--使用管道进行进程间通信概述)

各位看官们,大家好.上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用管道进行进程间通信. 闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的的章回中介绍了使用管道进行进程问的通信,时间不长,相信大家还记得.今天.我们介绍第二种进程间通信的方式:管道.大家都知道,我们使用信号在进程间通信时,本质上发送的是一个数值,假设想在进程之间发送一些数据时信号就无能为力了.此时,管道就派上了用场. 我们能够通过管道在进程之间发送数据. 接下来我们就具体介绍一下管道. 管道相似我们

一起talk C栗子吧(第十五回:C语言实例--双向链表)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们说的是循环链表的例子,这一回咱们说的例子是:双向链表. 看官们,双向链表也是一种链表.我们在前面两回中说到的链表,都是沿着链表头部到链表尾部这样的方 向进行操作,而今天咱们要说的双向链表既可以沿着链表头部到链表尾部这样的方向进行操作,也可以沿 着链表尾部到链表头部这样的方向进行操作.这也是正是叫它双向链表的原因. 在例子中,查找和删除结点

一起talk C栗子吧(第十六回:C语言实例--栈一)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们说的是双向链表的例子,这一回咱们说的例子是:栈. 什么是栈?我们听过龙门客栈,你这个是哪家客栈?我还没有说,台下已经有客官在问了.看官们,栈是 类似我们在前面几回中说过的链表,它也是用来存放数据的一种抽象的数据结构.因为比较抽象,咱们还 是举个现实生活中的例子来说明吧. 我们出去旅游时通常会拿一个行李箱存放自己的物品,比如衣服,鞋子电脑,