(10)《基于Linux的C编程与内核导读》--进程的软中断通信

2024-04-06 01:32

本文主要是介绍(10)《基于Linux的C编程与内核导读》--进程的软中断通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3.3.2 进程的软中断通信

本节我们编写一个实现软中断通信的程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上发出的中断信号(即按Delete键),当父进程接收到这两个软中断中的某一个后,父进程用系统调用kill()向两个子进程分别发出数值为1617的软中断信号,子进程获得对应软中断信号后执行相应动作然后终止,父进程调用wait()函数等待两个子进程终止后,输出一些信息,然后结束进程执行。

在此程序中我们用到了几个新的系统调用,如wait(),exit(),kill(),signal()等。其中exit()kill()容易理解,下面我们重点学习其它两个。

wait()函数常用来控制父进程与子进程的同步。在父进程中调用wait()函数,则父进程被阻塞,进入等待队列,等待子进程结束。当子进程结束时,会向父进程发出SIGCHLD信号。当接收到信号后,父进程提取子进程的终止状态字,从wait()函数返回继续执行原来的程序。

signal()函数允许调用进程控制软中断信号的处理,其具体功能和细节详见内核导读部分对signal()函数的分析。

下面我们就具体编写一个进程软中断通信的例子。

 

程序3.2如下:

/***********本程序用于进程的软中断通信*************/

#include

#include

int wait_flag;

void stop();

int main()

{

 int pid,i,j;

 pid=fork();                   /*创建子进程*/

 if(pid>0)                    /*以下是父进程代码*/

  { wait_flag=0;

    printf("This is parent:/n");

    sleep(5);                 /*父进程等待5*/

    kill(pid,17);              /*向子进程发出信号17*/

    printf("The kill signal has send!!/n");

    wait(0);                /*等待子进程的结束信号*/

    printf("The parent is ended!!/n");

  }

 else       /*以下是子进程代码*/

 {

   wait_flag=0;

   printf("This is child:/n");

   signal(17,stop);           /*若接收到信号17则执行stop函数*/

   while(1)                /*循环等待*/

{

/*若执行了stop函数,wait_flag会变为1,则子进程结束*/

if(wait_flag>0)

     {printf("The child is ended!!/n");

     exit(0); }

}/*end of while*/

 }/*end of child process*/

return 0;

}/*end of main*/

void stop()    /*信号执行句柄函数*/

{

 wait_flag=1;   /*若执行此函数,可让全局变量wait_flag变为1*/

}

 

结果分析:

下面首先给出编译运行后的一种结果:

This is parent:

This is child:

The kill signal has send!!

The child is ended!!

The parent is ended!!

 

    父进程在屏幕上输出This is parent后就进入休眠,等待5秒钟。这时执行子进程,由于父进程还没有发出信号17,因此stop函数还没有得到执行。这样wait_flag仍为0,子进程一直循环等待。当子进程接收到父进程kill发出的信号17后,产生软中断,进而执行句柄函数stop()。软中断返回后wait_flag已经变为1,这样子进程就可以结束了。当父进程的wait()函数接收到子进程的结束信号后也结束了,从而在屏幕上显示了以上的结果。

 

 原文地址 http://www.openlab.net.cn/blogs/zsb/archive/2005/08/29/444396.aspx

这篇关于(10)《基于Linux的C编程与内核导读》--进程的软中断通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878665

相关文章

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

Linux下安装Anaconda3全过程

《Linux下安装Anaconda3全过程》:本文主要介绍Linux下安装Anaconda3全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录简介环境下载安装一、找到下载好的文件名为Anaconda3-2018.12-linux-x86_64的安装包二、或者通

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.