Linux-C语言-利用有名管道简单实现两个进程间的全双工通信

article/2025/9/11 9:22:12
  1. 有名管道特点:

        1.有名管道是对无名管道的改进,它可以使互不相关的两个进程互相通信,并且在文件系统中可见,可以通过文件名来找到。

        2.半双工的通信方式,进程通过文件IO来操作有名管道。

        3.有名管道遵循先进先出原则,不支持lseek()。

  1.       2.有名管道的创建

                  配合IO即可实现两个进程间的全双工通信。

                3.代码

                1.父进程发,子进程收,(父进程间收发,子进程间收发)

#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<sys/wait.h>
int main(int argc, const char *argv[])
{unlink("myfifo1");unlink("myfifo2");if(mkfifo("myfifo1",0777)<0){perror("fifo1 create error");return -1;}else{printf("mkfifo1 OK!\n");}if(mkfifo("myfifo2",O_CREAT|0777)<0){perror("fifo2 create error");return -1;}else{printf("mkfifo2 OK!\n");}char buf[20]={'\0'};pid_t pid;pid=fork();if(pid<0){perror("fork error");return -1;}else if(0==pid){int fw2=open("myfifo2",O_RDONLY);if(fw2<0){perror("open myfifo2 error");return -1;}while(1){memset(buf,0,sizeof(buf));read(fw2,buf,sizeof(buf));printf("%s",buf);if(strncmp(buf,"exit",4)==0){break;}}close(fw2);exit(0);}else if(pid>0){int fw1=0;fw1=open("myfifo1",O_WRONLY);if(fw1<0){perror("open myfifo1 error");return -1;}while(1){waitpid(-1,NULL,WNOHANG);fgets(buf,sizeof(buf),stdin);write(fw1,buf,sizeof(buf));if(strncmp(buf,"exit",4)==0){break;}}close(fw1);}return 0;
}

                2.父进程收,子进程发

#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>
#include<stdlib.h>
#include<sys/wait.h>
int main(int argc, const char *argv[])
{char buf[20]={'\0'};pid_t pid;pid=fork();if(pid<0){perror("fork error");return -1;}else if(0==pid){int fw2=open("myfifo2",O_WRONLY);if(fw2<0){perror("open myfifo2 error");return -1;}while(1){fgets(buf,sizeof(buf),stdin);write(fw2,buf,sizeof(buf));if(strncmp(buf,"exit",4)==0){break;}}close(fw2);exit(0);}else if(pid>0){int fw1=0;fw1=open("myfifo1",O_RDONLY);if(fw1<0){perror("open myfifo1 error");return -1;}while(1){waitpid(-1,NULL,WNOHANG);memset(buf,0,sizeof(buf));read(fw1,buf,sizeof(buf));printf("%s",buf);if(strncmp(buf,"exit",4)==0){break;}}close(fw1);}return 0;
}

效果如下:

 退出时要先退出子进程,再退父进程,否则子进程就无法退出,变为孤儿进程,继续运行,需要利用信号将其杀死。


http://chatgpt.dhexx.cn/article/PwQYdQA1.shtml

相关文章

E70_433半双工无线模组,伪全双工方案

E70_433半双工无线模组&#xff0c;伪全双工方案 前言架构设计外侧输入模块外侧输出模块内侧发帧模块内侧接受模块 实现代码通用宏定义代码解析 通用工具函数代码解析 串口输入输出函数代码解析 核心业务代码发送模块代码解析 接收模块代码解析代码流程 结语附带 前言 要搞一个…

计算机双工模式,100M 全双工、100M 半双工、10M全双工几种模式分别测试

1. 首先核实是否有多台电脑同时上网&#xff0c;或是当前电脑有没有在进行P2P下载或在线视频之类比较占用网络带宽的操作&#xff0c;此操作可能导致宽带数据量过大影响稳定性。若存在此情况&#xff0c;请关闭些软件断开些联网设备&#xff0c;减少带宽使用测试。 2. 若有其他…

Linux 查看网卡全双工 还是半双工 以及设置网卡为半双工

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴! 请问各位兄弟,在Linux中怎么看网卡是全双工工作还是半双工工作?mii-tool Linux:~ # mii…

路由之静态路由配置

一、路由概念 二、路由表的形成 三、路由协议 静态路由 路由器之间的连接需要配置静态路由 首先创建一个局域网&#xff0c;给pc0和pc1分别配置ip地址。 创建三个不同网段的局域网分别给电脑配置ip地址&#xff0c;将三个连接到一个路由上。为路由器与局域网相连的端口&#…

路由器静态路由配置实验

简单配置: 1.连接设备 2.配置PC和服务器的IP地址和网关 3.在路由器配置接口的IP地址(作为网关) 4.实现PC之间的通信 5.分别命名交换机和路由器,并设置时间 6.实现PC1可以telnet和ssh管理SW2和R1 7.配置静态路由实现全网互通 8.开启web服务器,在4台PC上测试是否能访问 实验…

静态路由配置实验

题目&#xff1a; 目录 1、首先进行基础配置 2、创建环回接口并配置IP地址 3、配置静态路由 对r1&#xff0c;要配置除自身连接的3个网段以外的5个网段 对r2&#xff0c;要配置除自身连接的3个网段以外的5个网段,其中3.3.3.0/24网段已配过&#xff0c;则配剩余4个网段 对r…

华为简单静态路由配置

今天通过学习路由交换的知识&#xff0c;学会了配置简单的静态路由&#xff0c;所以我这里介绍一个简单的实 验&#xff0c;在开始之前&#xff0c;我们要先了解一下什么是路由&#xff1f; 路由 路由是指导报文转发的路径信息&#xff0c;通过路由可以确认转发IP报文的路径。…

vue 3.0 静态路由配置

今天研究了一下vue3.0的静态路由配置&#xff0c;分享一下。 首先我们现在项目中建立router文件夹&#xff0c;如下图所示&#xff1a; 404文件夹存放404页面&#xff0c;components文件夹存放首页界面&#xff0c;config为设置文件夹&#xff0c;diz存放具体的业务逻辑和界面…

计算机配置静态路由目标,静态路由的配置命令

用户需求: 某学校网络拓扑图如图所示,要求配置静态路由,实现计算机PC1、PC2和PC3互通。 直连路由直连路由出现在路由表的条件 (1)接口为“up/up”状态。 (2)接口已经完成了IP地址的配置。直连路由的检查 静态路由是指由网络管理员手工配置的路由信息,用于定义去往目的网络的…

路由基础(简单的静态路由配置)

目录 一.路由基础 1.路由信息获取方式 2.路由加表前的比较-优先级&#xff1b;度量值 3.路由转发的选择-最长掩码 4.静态路由应用场景及配置 1.路由信息获取方式 路由器依据路由表进行转发&#xff0c;要实现转发功能&#xff0c;路由器需要发现路由&#xff0c;三种常见…

四种静态路由配置方法

拓扑图如下&#xff1a; 接口IP地址如拓扑图所示&#xff0c;配置过程省略&#xff0c;ar1和ar3都开启了dhcp。过程省略。 ar1的路由表&#xff1a; 此时只有直连的1.0和2.0网段的IP。没有3.0网段的。 那怎么有3.0网段的呢&#xff1f;接下来介绍四种方法。 方法一&#xff1a…

Windows系统的静态路由配置

Windows电脑静态路由的配置&#xff0c;使电脑同时使用两个不同网段的IP 操作方法&#xff1a; 1.开始菜单&#xff0c;输入cmd&#xff0c;右击cmd.exe&#xff0c;选择以管理员身份运行 2.查看当前路由的配置 命令格式&#xff1a; ##查看静态路由 route print 输出结果…

华为静态路由配置

静态路由 静态路由(Static Router)是由管理员通过手动配置的方式创建的路由&#xff0c;可以让路由器便捷的获知到达目的网络的路由。在静态路由基础上也可使用负载均衡、路由备份等技术。 本文分别对静态路由、负载均衡、路由备份进行实验配置及配置完之后如何验证。 网络拓…

ENSP静态路由配置

拓扑图 实现结果&#xff1a; 1.pc1访问pc345走上面R1,R2&#xff0c;R2实现备份21.1.1.0/24&#xff0c;实现备份pc3456访问pc12走下面的R3,R4并实现等价路由&#xff0c;尽量减少路由条目&#xff0c;全网可达 2.R7代表运行商&#xff0c;所有pc均可访问 第一步&#xff1a…

静态路由配置全面详解,静态路由快速入门指南

操作步骤 配置各路由器接口的IP地址 以配置Router_1的GE0/0/0接口为例&#xff0c;其他接口配置与之类似&#xff0c;不再重复介绍。 a、如图2所示&#xff0c;依次选择“广域网互联 > 以太接口”&#xff0c;进入“以太接口”界面。 图2 以太接口界面 b、在“以太接口列…

12 路由器静态路由配置

借鉴网址&#xff1a;(28条消息) Packet Tracer 思科模拟器入门教程 之十一 路由器静态路由配置_柚子君.的博客-CSDN博客_思科模拟器新手详细教程 姓 名 彭彭头 实验日期 2022.04.26 学 号 实验序号 12 实验名称 路由器静态路由配置 一、实验目的及要求 掌握静态路由…

静态路由配置案例

静态路由配置案例 配置静态路由原理命令&#xff1a;案例&#xff1a;最后结果&#xff1a; 配置静态路由原理命令&#xff1a; [Huawei]ip route-static 来源ip 子网掩码 去向ip [Huawei]ip route-static 192.168.20.1 255.255.255.0 192.168.1.2 案例&#xff1a; pc1,pc2…

ipv6 静态路由配置

ipv6 静态路由配置 R1 配置 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]sysname R1 [R1]ipv6 # 全局使能 ipv6 [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ipv6 enable [R1-GigabitEthernet0/0/0]ipv6 add…

路由器静态路由配置

实验名称 路由器静态路由配置 一、实验目标 1.掌握静态路由的配置方法和技巧&#xff1b; 2.掌握通过静态路由方式实现网络的连通性&#xff1b; 3.熟悉广域网线缆的链接方式&#xff1b; 二、实验背景 学校有新旧两个校区&#xff0c;每个校区是一个独立的局域网&…

linux配置ipv6静态路由,IPv6静态路由配置

IPv6静态路由 命令: R1(config)#ipv6 unicast-routing //启用IPv6路由 R1(config-if)#ipv6 address 2010:1111::1/64 //手工配置IPv6地址 R1(config-if)#ipv6 address 2010:1111::1/64 eui-64 //自动配置IPv6地址 R1(config)#ipv6 route 2009:2323::/64 s0/0 //配置IPv6静态路…