一起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停止了运行。

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值