(11)《基于Linux的C编程与内核导读》--进程间管道通信(一)

2024-04-06 01:32

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

3.3.3 进程间管道通信(一)

本节我们学习利用管道实现进程间的通信。这中间用到一个关键的系统调用pipe()函数。其格式为:

int fd[2];

pipe(fd);

 

其中,fd[2]是供进程使用的文件描述符数组,fd[0]用于写,fd[1]用于读。为了协调双方的通信,管道通信机制必须提供以下三方面的协调能力:

1、互斥。当一个进程正在对pipe进行读/写操作时,另外一个进程必须等待,程序中使用lockf(fd[1],1,0)函数实现对管道的加锁操作,用lockf(fd[1],0,0)解除管道的锁定。

2、同步。当写进程把一定数量的数据写入pipe后,便去睡眠等待,直到读进程取走数据后,再把它唤醒。当读进程试图从一空管道读取数据时,也应睡眠等待,直至写进程将数据写入管道后,才将其唤醒。

3、判断对方是否存在。只有确定写进程和读进程都存在的情况下,才能通过管道进行通信。

下面我们就具体编写一个进程间管道通信的例子。

 

程序3.3如下:

/*************本程序用于进程间的管道通信*****************/

#include

#include

#include

int pid1,pid2;

main()

{

int fd[2];

char OutPipe[100],InPipe[100];

pipe(fd);                   /*创建管道 */

while((pid1 = fork()) == -1);

if(pid1 == 0)     /*子进程1执行管道写操作 */

{

lockf(fd[1],1,0);         /*锁定管道 */

/*****OutPipe数组赋值******/

sprintf(OutPipe,"Child process 1 is sending message!/n");

write(fd[1],OutPipe,50);      /*向管道中写入数据 */

sleep(5);

lockf(fd[1],0,0);               /*管道解锁*/

exit(0);

}

else

{

while((pid2 = fork()) == -1);

if(pid2 == 0)     /*子进程2执行管道写操作 */

{

lockf(fd[1],1,0);         /*锁定管道 */

sprintf(OutPipe,"Child process 2 is sending message!/n");

write(fd[1],OutPipe,50);   /*向管道中写入数据 */

sleep(5);

lockf(fd[1],0,0);          /*管道解锁*/

exit(0);

}

else    /*父进程执行管道读操作*/

{

wait(0);                /*等待子进程1结束*/

read(fd[0],InPipe,50);      /*从管道中读出数据*/

printf("%s/n",InPipe);

wait(0);                /*等待子进程2结束*/

read(fd[0],InPipe,50);      /*从管道中读出数据*/

printf("%s/n",InPipe);

exit(0);

}

}

}

 

结果分析:

子进程1将字符串“Child process 1 is sending message!”写入管道;子进程2将字符串“Child process 2 is sending message!”写入管道。父进程分别使用wait(0)函数来等待子进程执行结束,然后从管道中读出数据,并分别在屏幕上显示出来。所以此程序执行的结果是:

Child process 1 is sending message!

Child process 2 is sending message!

 

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

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



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

相关文章

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.