【操作系统】操作系统课后作业-聊天程序

无名管道与有名管道的区别

无名管道

它是半双工的,具有固定的读端和写端。

只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。

不是普通的文件,不属于其他任何文件系统,并且只存在于内存中。

有名管道FIFO

FIFO可以在无关的进程之间交换数据。

FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

思路

父进程负责写,子进程负责读。

FIFO1负责存储用户a发出的消息,

FIFO2负责存储用户b发出的消息。

代码

chat_a.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>int main(){pid_t pid = fork();if (pid > 0){//a的父进程写FIFO1char *fifo1 = "./fifo1";//判断fifo1是否存在int ret = access(fifo1, F_OK);if (ret == -1){//文件不存在,需要创建ret = mkfifo(fifo1, 0664);if (ret == -1){//创建失败 perror("mkfifo error");exit(-1);}}//文件fifo1存在,以只写方式打开int fdw = open(fifo1, O_WRONLY);if (fdw == -1){perror("open error");exit(-1);}printf("a:successfully opened fifo1\n");//循环写入数据char buf[256];while (1){memset(buf, 0, sizeof(buf));//获取标准输入的数据fgets(buf, sizeof(buf), stdin);//写数据到fifo1int len = write(fdw, buf, strlen(buf));if (len == -1){perror("write error");break;}printf("\n");}close(fdw);}else if (pid == 0){//a的子进程读FIFO2char *fifo2 = "./fifo2";//判断FIFO2是否存在int ret = access(fifo2, F_OK);if (ret == -1){//文件不存在,需要创建ret = mkfifo(fifo2, 0664);if (ret == -1){//创建失败perror("mkfifo error");exit(-1); }}//文件FIFO2存在,以只读方式打开int fdr = open(fifo2, O_RDONLY);if (fdr == -1){perror("open error");exit(-1);}printf("a:successfully opened fifo2\n");//循环读数据char buf[256];while (1){memset(buf, 0, sizeof(buf));int len = read(fdr, buf, sizeof(buf));if (len <= 0){perror("read");break;}printf("b: %s\n", buf);}close(fdr);}return 0;
}

chat_b.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>int main(){pid_t pid = fork();if (pid > 0){//b的父进程写FIFO2char *fifo2 = "./fifo2";//判断文件fifo2是否存在int ret = access(fifo2, F_OK);if (ret == -1){//文件不存在,需要创建ret = mkfifo(fifo2, 0664);if (ret == -1){perror("mkfifo error");exit(-1);}}//文件fifo2存在,以只写方式打开int fdw = open(fifo2, O_WRONLY);if (fdw == -1){perror("open error");exit(-1);}printf("b:successfully opened fifo2\n");//循环写入数据char buf[256];while (1){memset(buf, 0, sizeof(buf));//获取标准输入的数据fgets(buf, sizeof(buf), stdin);//写数据到fifo2int len = write(fdw, buf, strlen(buf));if (len == -1){perror("write error");break;}printf("\n");}close(fdw);}else if (pid == 0){//b的子进程读FIFO1char *fifo1 = "./fifo1";int ret = access(fifo1, F_OK);if (ret == -1){//文件不存在,需要创建ret = mkfifo(fifo1, 0664);if (ret == -1){perror("mkfifo error");exit(-1); }}//文件FIFO1存在,以只读方式打开int fdr = open(fifo1, O_RDONLY);if (fdr == -1){perror("open error");exit(-1);}printf("b:successfully opened fifo1\n");// 循环读数据char buf[256];while (1){memset(buf, 0, sizeof(buf));int len = read(fdr, buf, sizeof(buf));if (len <= 0){perror("read");break;}printf("a: %s\n", buf);}close(fdr);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Electron+Vue开源软件:洛雪音乐助手V2.8畅享海量免费歌曲

洛雪音乐助手是一款功能全面且完全免费的开源音乐软件&#xff0c;支持在Windows、Android和iOS平台上使用。 平台支持&#xff1a; 桌面版&#xff1a;采用Electron Vue技术栈开发&#xff0c;支持Windows 7及以上版本、Mac OS和Linux&#xff0c;具有广泛的用户群体覆盖。 …

深信服终端安全管理系统EDR版本升级过程

EDR当前版本为3.7.12&#xff0c;具体参考版本详情参数。需要升级到6.0.2R1版本&#xff0c;该版本更改了产品名称&#xff0c;叫做“统一端点安全管理系统aES” 当前版本详情 版本基础信息 软件版本&#xff1a;3.7.12.3829 病毒库版本&#xff1a;20240618174426 漏洞规则库&…

【安全边界】

1.安全边界是什么 安全边界是具有不同安全要求或需求的任意两个区域、子网或环境之间的交叉线。它存在于高安全性区域和低安全性区域之间&#xff0c;例如局域网&#xff08;LAN&#xff09;和互联网&#xff08;Internet&#xff09;之间。 2.为什么要建设安全边界 安全边界…

PHP入门教程5:会话管理和数据库操作

PHP入门教程5&#xff1a;会话管理和数据库操作 在前几篇文章中&#xff0c;我们学习了PHP的基础语法、控制结构、函数的使用、数组和字符串的操作&#xff0c;以及文件处理和表单处理。本文将重点介绍PHP中的会话管理和数据库操作&#xff0c;这是构建动态网站和Web应用程序的…

java.sql.Timestamp用法总结

java.sql.Timestamp用法总结 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 概述 java.sql.Timestamp是Java中表示日期和时间的类&#xff0c;它继承自jav…

定制化物联网设备:开启智能生活新篇章

随着科技的进步&#xff0c;物联网&#xff08;IoT&#xff09;已成为我们日常生活和工作中不可或缺的一部分。从智能家居到工业自动化&#xff0c;物联网设备以其独特的功能和特性&#xff0c;极大地提高了我们的生活质量和工作效率。然而&#xff0c;在众多的物联网设备中&am…

Window常用的脚本有哪些?快来看看有哪些是你正在用的!(欢迎评论补充~)

前言 在日常开发中&#xff0c;如果能熟练掌握以下这些使用频率很高的脚本&#xff0c;那工作起来真的是手拿把攥&#xff0c;事半功倍&#xff0c;接下来给大家介绍一些我们日常使用率很高的一些脚本&#xff01; 常用脚本(Batchfile & VBScript) 1.一键启动.bat 一次…

负利率(Negative Interest Rates)是什么?商业银行会对普通储户实施负利率吗?

负利率是什么&#xff1f; 中文版 负利率是指中央银行或金融机构对存款人收取存款费用&#xff0c;而不是支付利息。这意味着存款人在银行存钱不仅不能赚取利息&#xff0c;反而要支付费用。以下是对负利率的详细解释&#xff1a; 负利率的理解 定义&#xff1a; 负利率意味…

ServletResponse类及其使用方法介绍

在Java Servlet技术中&#xff0c;ServletResponse是一个接口&#xff0c;它定义了服务器响应客户端请求的API。这个接口提供了设置响应头、发送错误、以及管理响应内容的方法。以下是对ServletResponse接口中一些重要方法的介绍以及它们的使用示例。 ServletResponse接口概述…

每年1-1.2万人毕业,男女比例约3:1,测绘工程的就业率如何

测绘工程&#xff0c;一个让人闻风丧胆的理科专业&#xff0c;虎扑评分4.2&#xff1a; 干过测绘的&#xff0c;苦不苦只有大家心里知道&#xff0c;带大家来感受一下&#xff0c;兄弟们的精神状态都十分美妙&#xff1a; 测绘专业到底是什么情况&#xff1f; PS.测绘分为本科…

mongodb-java apispringboot整合mongodb

mongodb入门mongodb-java api的使用springboot整合mongodb评论 一 MongoDB 1.1 MongoDB简介 ​ MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 ​ MongoDB是一个介于关系数据库和非关系数据库之间的产品&…

等保2.0对于物联网设备的漏洞管理还有哪些规定?

等保2.0针对物联网设备的漏洞管理&#xff0c;主要规定了以下几个方面&#xff1a; 1. 漏洞发现与识别&#xff1a;要求定期进行漏洞扫描和评估&#xff0c;利用专业的漏洞扫描工具和安全服务&#xff0c;及时发现物联网设备及其软件中的安全漏洞。这包括但不限于操作系统、应…

文献解读-流行病学-第十期|《SARS-CoV-2 德尔塔和奥密克戎合并感染和重组的证据》

关键词&#xff1a;基因组变异检测&#xff1b;全基因组测序&#xff1b;流行病学&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;Evidence for SARS-CoV-2 Delta and Omicron co-infections and recombination标题&#xff08;中文&#xff09;&#xf…

leetcode402场周赛——构成整天的下标对数目(javascript)

leetcode402场周赛——构成整天的下标对数目 原始题目链接&#xff1a; 402场周赛 题目描述 给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 …

Leetcode 135. 分发糖果(问题分解)

Leetcode 135. 分发糖果 根据描述&#xff0c;可知更多糖果发生在相邻两个孩子的rating更高者中&#xff0c;对于一个孩子来说&#xff0c;左右两侧都视为相邻&#xff0c;即ratings[ i ] > ratings[ i-1 ] 或 ratings[ i ] > ratings[ i1 ]都会令糖果增加 由此则将问题…

手持风扇哪个品牌好?五大手持风扇品牌推荐!

随着炎热夏季的到来&#xff0c;手持风扇已成为人们出行的必备清凉神器。然而&#xff0c;面对市场上众多品牌的手持风扇&#xff0c;如何选择一款既时尚又高效的产品成为了许多消费者的难题。为了解决这个困扰&#xff0c;我们精心挑选了五大手持风扇品牌进行推荐。这些品牌不…

报表控件Stimulsoft 图表轴的日期时间步长模式

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…

Qt|海康摄像头多个页面展示问题

为大家分享一个使用海康摄像头的小功能&#xff0c;希望对大家有用~ 使用场景&#xff1a; 在程序中多个不同功能页面需要展示摄像头的实时预览画面&#xff0c;该如何高效的展示呢&#xff1f; 对于海康摄像头的实时预览接口调用流程&#xff0c;如下所示&#xff1a; 按照流…

JS正则表达式构造函数和正则表达式字面量的区别

背景 笔者在使用正则表达式的过程中&#xff0c;经常看到两种使用方式&#xff0c;比较好奇这两种方式有什么不同。 一种是 正则表达式构造函数&#xff1a;new RegExp(“[xxx]”) 另一种是 正则表达式字面量&#xff1a; /[xxx]/ 于是&#xff0c;就去网上搜了一下…结果看到国…

阿里云ECS(CentOS/Alibaba Cloud Linux)安装最新 Docker 方法

最近&#xff08;6月份&#xff09;我发现 docker 官方无法正常访问&#xff0c;docker pull 命令也执行失败&#xff0c;用 TZ 也一样&#x1f614;。 以下步骤适用于 CentOS 7/8或Alibaba Cloud Linux 系统。 1. 更新系统包 首先&#xff0c;确保您的ECS实例系统软件包是最…