各位看官们,大家好,上一回中咱们说的是使用信号进行进程间通信的样例,这一回咱们接着上一回的内容,继续说该样例。闲话休提。言归正转。

让我们一起talk C栗子吧。

我们在上一回中举了使用信号进行进程间通信的样例,在该样例中。我们通过终端发出信号。当进程收到该信号后让它运行系统对信号定义的默认动作。这一回。我们再来举一个使用信号进行进程间通信的样例,只是。我们发送和处理信号的方式和上一回的样例不一样。在接下来的样例中,我们在一个进程中使用kill产生信号。在另外一个进程中接收而且依照自己的方式处理接收到的信号

在样例中我们使用kill函数给其他进程发送信号,以下是kill函数的原型

int kill(pid_t pid, int signo);
  • 第一个參数pid表示进程的PID。kill函数将把信号发送给PID与其參数同样的进程;
  • 第二个參数表示信号。该參数表示kill函数发送的信号值。

  • 假设kill成功发送信号,那么返回0,否则返回-1.

在样例中我们使用signal函数设置接收到信号后的处理方式。以下是signal函数的原型

void (*signal(int signo, void (*func) (int))) (int)

大家看着这个函数是不是认为有点乱?先别慌。我们慢慢对它进行分析。

这个函数名叫signal,它用来配置信号处理函数,通俗点说,它就是为某个信号分配一个信号处理函数。

它有两个參数:

  • 一个參数是signo,表示信号值。
  • 另外一个參数是一个名叫func的函数指针,它表示信号处理函数。
  • 也就是说进程接收到signo表示的信号后会使用该函数来处理信号。

  • 參数中的func是一个函数指针,它指向的函数包括一个int类型的參数,表示信号值,该函数返回void。
  • 最后,我们说一下signal函数的返回值,它返回一个函数。该函数就是func指向的信号处理函数。

接下来,我们通过具体的代码来说明它们的使用方法

#include<unistd.h>
#include<signal.h>
#include<stdio.h> void sig_receive(int signo)
{
printf("received signal :%d \n",signo);
} int main()
{
pid_t pid;
int pid_res;
int stat_value; pid = fork(); if(pid > 0)
{
printf("PID: %d -> Father Process send signal\n",getpid());
kill(pid,SIGALRM); //发送信号
}
else if(pid == 0)
{
signal(SIGALRM,sig_receive); //配置信号处理函数
printf("PID: %d -> Son Process receive signal \n",getpid());
}
else
{
printf("Create process failed \n");
return 1;
} pid_res = wait(&stat_value); if(pid_res > 0)
{
printf("Son process finished: PID = %d \n",pid_res);
} return 0;
}

从上面的代码中能够看到,我们在父进程中使用kill函数发送信号,然后在子进程中使用signal函数配置信号处理函数,当子进程收到信号后。信号处理函数就会对该信号进行处理。

看官们,正文中就不写代码了,具体的代码放到了我的资源中,大家能够点击这里下载使用。

以下是程序的运行结果,请大家參考

PID: 3208 -> Father Process send signal      //父进程发送信号
received signal :14 //信号处理函数在处理信号
PID: 3209 -> Son Process receive signal //子进程收到信号
Son process finished: PID = 3209 //子进程结束,父进程也结束

看官们,从程序的结果中能够看出,父进程发出信号后,子进程收到了信号,而且进行了处理

这说明我们通过信号在两个进程之间进行了通信

看官们,有个小的细节不知道大家有没有发现:程序运行结果中先是运行信号处理函数中的内容,然后才运行子进程中的内容。假设我们把运行的顺序调换一下会有什么现象呢?

把以下这两行代码的运行顺序调换一下,也是说把printf语句放在signal配置语句的前面。

        signal(SIGALRM,sig_receive);  //配置信号处理函数
printf("PID: %d -> Son Process receive signal \n",getpid());

又一次编译而且运行程序后,得到以下运行结果

PID: 2611 -> Father Process send signal  //父进程发送信号
Son process finished: PID = 2612 //子进程结束,父进程也结束

从上面的结果中以能够看到,子进程不但没有收到信号。而且没有运行。这是什么原因呢?那是由于父进程发信号的时候子进程可能被堵塞,所以没有运行。这也是signal函数缺点。

signal函数是早期Unix系统提供的函数,如今的新系统中已经使用sigaction函数代替它。只是在一些老的程序中还是能看到它的身影。下一回中。我们将介绍sigcation函数相关的内容。

各位看官,关于使用信号进行进程间通信的样例咱们就讲到这里。

欲知后面还有什么样例,且听下回分解 。


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

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

    各位看官们,大家好,上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用信号进行进程间通信.闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在上一回中提到过进程之间通信须要解决的三 ...

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

    各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...

  3. 一起talk C栗子吧(第二十五回:C语言实例--二分查找)

    各位看官们,大家好,上一回中咱们说的是顺序查找的样例,这一回咱们说的样例是:二分查找.闲话休 提,言归正转. 让我们一起talk C栗子吧. 看官们,我们在上一回中说了查找的相关内容,而且介绍了一种查 ...

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

    各位看官们,大家好,上一回中咱们说的是表达式求值的样例,该样例使用了栈,这一回咱们说的是栈的 兄弟:队列. 闲话休提,言归正转.让我们一起talk C栗子吧. 我们在这里说的队列是一种抽象的数据结构, ...

  5. 一起talk C栗子吧(第九十五回:C语言实例--使用共享内存进行进程间通信一)

    各位看官们,大家好,上一回中咱们说的是SystemV IPC结构概述的样例,这一回咱们说的样例是:使用共享内存进行进程间通信. 闲话休提.言归正转.让我们一起talk C栗子吧! 共享内存是Syste ...

  6. 第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现,回填数据以及错误提示html

    第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现 1,配置登录路由 from django.conf.urls import url, include # 导入dja ...

  7. “全栈2019”Java第八十五章:实现接口中的嵌套接口

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. 孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1

    孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1 (完整学习过程屏幕记录视频地址在文末) 要模拟进行浏览器操作,只用requests是不行的,因此今天了解到有专门的解决方案 ...

  9. 《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)

    1.简介 TestNG为日志记录和报告提供的不同选项.现在,宏哥讲解分享如何开始使用它们.首先,我们将编写一个示例程序,在该程序中我们将使用 ITestListener方法进行日志记录. 2.Test ...

随机推荐

  1. 简单实用UML关系图解

    一句话UML,再记不住就要DPP了: 关系 图解 代码 备注 1:继承关系(Generalization)     2:实现关系(Realization)     3:依赖关系(Dependency) ...

  2. SVG.js Mask覆盖和ClipPath裁剪

    一.SVG.Mask 覆盖物设置 1. var draw = SVG('svg1').size(300, 300); //SVG.Mask 覆盖物设置 var ellipse = draw.ellip ...

  3. pkg-config原理及用法

    原文  https://blog.csdn.net/luotuo44/article/details/24836901 我们在用第三方库的时候,经常会用到pkg-config这个东西来编译程序.那pk ...

  4. Eclipse国内镜像源配置方法

    Table of Contents 我们在国内从官网下载Eclipse以及插件非常慢,那么,有没有方法变快呢? 有,那就是使用国内的公开镜像源替换官方源. 1 下载Eclipse 首先,我们看一个链接 ...

  5. 【经验】STL的list vector在iterator迭代器的循环中 使用erase 造成的BUG

    #include <iostream> #include <list> #include <vector> using namespace std; typedef ...

  6. [置顶] 不刷机让越狱后的iphone恢复出厂设置

    iphone越狱后,设置里的清除所有内容和设置选项是不生效的,选上之后菊花转个不停,只能强制退出,还有白苹果的危险. 若想恢复出厂设置有两个办法: 一.刷机 最直接的办法,我觉得itunes配合ito ...

  7. scrapy框架系列 (4) Scrapy Shell

    Scrapy Shell Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据 ...

  8. 关于android SDK安装Failed to fetch URL 一点思考

    最近SDK出问题了,然后在google下载了一个android-sdk-windows.rar,然后点击SDK Manager,结果一直不能刷新API Level,然后就开始在网上找了好多资料,解决这 ...

  9. 集成学习总结 & Stacking方法详解

    http://blog.csdn.net/willduan1/article/details/73618677 集成学习主要分为 bagging, boosting 和 stacking方法.本文主要 ...

  10. [转]Python机器学习工具箱

    原文在这里  Python在科学计算领域,有两个重要的扩展模块:Numpy和Scipy.其中Numpy是一个用python实现的科学计算包.包括: 一个强大的N维数组对象Array: 比较成熟的(广播 ...