2024.8.5 作业
使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份
代码:
/*******************************************/
文件名:create.c
/*******************************************/
#include <myhead.h>
int main(int argc, char const *argv[])
{//创建有名管道文件if (mkfifo("./linux", 0664) == -1){perror("mkfifo error");return -1;}getchar();system("rm linux");return 0;
}
/*******************************************/
文件名:send.c
/*******************************************/
#include <myhead.h>
int main(int argc, char const *argv[])
{//以写的形式打开管道文件int wfd = open("./linux", O_WRONLY);if (wfd == -1){perror("open error");return -1;}printf("管道文件已经打开\n");//发送数据char wbuf[128] = "";while (1){printf("请输入>>>>");fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf) - 1] = 0;//将数据发送给到管道中write(wfd, wbuf, strlen(wbuf));//判断数据if (strcmp(wbuf, "quit") == 0){break;}}//关闭文件描述符close(wfd);return 0;
}
/*******************************************/
文件名:get.c
/*******************************************/
#include <myhead.h>
int main(int argc, char const *argv[])
{//以读的形式打开文件int rfd = open("./linux", O_RDONLY);if (rfd == -1){perror("open error");return -1;}int cfd = open("./h.txt", O_WRONLY);if (cfd == -1){perror("open error");return -1;}printf("管道文件读端打开\n");//定义接受容器char rbuf[128] = "";while (1){bzero(rbuf, sizeof(rbuf));//读取数据read(rfd, rbuf, sizeof(rbuf));if (strcmp(rbuf, "quit") == 0){break;}printf("收到消息为:%s\n", rbuf);write(cfd,rbuf,strlen(rbuf));}//关闭文件描述符close(rfd);close(cfd);return 0;
}
结果:

使用有名管道实现两个进程间相互通信
代码:
/*******************************************/
文件名:create1.c
/*******************************************/
#include <myhead.h>
int main(int argc, char const *argv[])
{//创建有名管道文件if (mkfifo("./linux_first", 0664) == -1){perror("mkfifo error");return -1;}getchar();system("rm linux_first");return 0;
}
/*******************************************/
文件名:create2.c
/*******************************************/
#include <myhead.h>
int main(int argc, char const *argv[])
{//创建第二个有名管道文件if (mkfifo("./linux_next", 0664) == -1){perror("mkfifo error");return -1;}getchar();system("rm linux_next");return 0;
}
/*******************************************/
文件名:one.c
/*******************************************/
#include <myhead.h>
sem_t sem;
void *task1(void *arg)
{//只读的形式打开管道文件2int rfdo = open("./linux_next", O_RDONLY);if (rfdo == -1){perror("open error");return NULL;}//定义接收容器char rbufo[128] = "";while (1){bzero(rbufo, sizeof(rbufo));//读取数据read(rfdo, rbufo, sizeof(rbufo));if (strcmp(rbufo, "quit") == 0){sem_post(&sem);break;}printf("对方的消息>>>%s\n", rbufo);sem_post(&sem);}//关闭文件描述符close(rfdo);pthread_exit(NULL); //退出线程
}
void *task2(void *arg)
{//只写的形式打开管道文件1int wfdo = open("./linux_first", O_WRONLY);if (wfdo == -1){perror("open error");return NULL;}//发送数据char wbufo[128] = "";while (1){sem_wait(&sem);printf("对话>>>");fgets(wbufo, sizeof(wbufo), stdin);wbufo[strlen(wbufo) - 1] = 0;write(wfdo, wbufo, strlen(wbufo));if (strcmp(wbufo, "quit") == 0){break;}}//关闭文件描述符close(wfdo);
}
int main(int argc, char const *argv[])
{//初始化无名信号量sem_init(&sem, 0, 1);//定义变量存储线程号pthread_t tido = -1;if (pthread_create(&tido, NULL, task1, NULL) != 0){printf("pthread_create error\n");return -1;}//定义变量存储线程号pthread_t tido2 = -1;if (pthread_create(&tido2, NULL, task2, NULL) != 0){printf("pthread_create error\n");return -1;}//阻塞回收线程的资源pthread_join(tido, NULL);pthread_join(tido2, NULL);//销毁无名信号量sem_destroy(&sem);return 0;
}
/*******************************************/
文件名:another.c
/*******************************************/
#include <myhead.h>
sem_t sem;
void *task1(void *arg)
{//只写的形式打开管道文件2int wfda = open("./linux_next", O_WRONLY);if (wfda == -1){perror("open error");return NULL;}//发送数据char wbufa[128] = "";while (1){sem_wait(&sem);printf("对话>>>");fgets(wbufa, sizeof(wbufa), stdin);wbufa[strlen(wbufa) - 1] = 0;write(wfda, wbufa, strlen(wbufa));if (strcmp(wbufa, "quit") == 0){break;}}//关闭文件描述符close(wfda);pthread_exit(NULL); //退出线程
}
void *task2(void *arg)
{//只读的形式打开管道文件1int rfda = open("./linux_first", O_RDONLY);if (rfda == -1){perror("open error");return NULL;}//定义接收容器char rbufa[128] = "";while (1){bzero(rbufa, sizeof(rbufa));//读取数据read(rfda, rbufa, sizeof(rbufa));if (strcmp(rbufa, "quit") == 0){sem_post(&sem);break;}printf("对方的消息>>>%s\n", rbufa);sem_post(&sem);}//关闭文件描述符close(rfda);pthread_exit(NULL); //退出线程
}
int main(int argc, char const *argv[])
{//初始化无名信号量sem_init(&sem, 0, 0);//定义变量存储线程号pthread_t tida = -1;if (pthread_create(&tida, NULL, task1, NULL) != 0){printf("pthread_create error\n");return -1;}//定义变量存储线程号pthread_t tida2 = -1;if (pthread_create(&tida2, NULL, task2, NULL) != 0){printf("pthread_create error\n");return -1;}pthread_join(tida, NULL);pthread_join(tida2, NULL);//销毁无名信号量sem_destroy(&sem);return 0;
}
结果:

思维导图:

相关文章:
2024.8.5 作业
使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份 代码: /*******************************************/ 文件名:create.c /********…...
MySQL数据库——数据库的基本操作
目录 三、数据库的基本操作 1.数据库中库的操作 ①创建数据库 ②字符集和校验规则 ③操纵数据库 ④备份与恢复 2.数据库中表的操作 ①创建表 ②查看表 1> 查看表位于的数据库 2>查看所有表 3>查看表中的数据 4>查看创建表的时候的详细信息 ③修改表 …...
SQL数据库语句练习
1、mysql常用的数据类型是_整数(int)__、_小数(decimal)__、_字符串(varchar)__、_日期时间(datetime)___。 2、mysql的约束有__主键(primary key)_、_非空&…...
【Python】常用的pdf提取库介绍对比
提取PDF内容的Python库有多种选择,每个库都有其独特的优缺点。以下是一些常用的库以及它们的优缺点和示例代码: pdfplumberPyMuPDF (fitz)PyPDF2PDFMinerCamelot 1. pdfplumber 优点: 易于使用,提供简单直观的API。能提取文本…...
sbatch提交并行作业 运行python程序 指定输入参数从1到100
#!/bin/bash #SBATCH --job-namemy_python_job #SBATCH --outputmy_python_job_%j.out #SBATCH --errormy_python_job_%j.err #SBATCH --ntasks100# 载入所需模块 # module load python/3.8.5# 执行Python脚本并传递任务ID作为参数 for i in {1..100}; dosrun python my_script…...
OD C卷 - 中庸行者
中庸行者 (200) 给一个m*n的整数矩阵作为地图,矩阵数值为地形的高度,选择图中任意一点作为起点,向左右上下四个方向移动: 只能上坡、下坡,不能走相同高度的点;不允许连续上坡 或者连…...
最新CSS3横向菜单的实现
横向菜单 原始代码: <nav class"list1"><ul><li><a href"#">Shirts</a></li><li><a href"#">Pants</a></li><li><a href"#">Dresses</a>…...
(2024,LlamaGen,Llama,自回归下一token预测,模型扩展)自回归模型优于扩散:Llama 用于可扩展图像生成
Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation 目录 0. 摘要 1. 引言 2. 自回归模型在图像生成中的应用 2.1 概述 2.2 图像 tokenizer 2.3 自回归模型生成图像 2.4 规模扩展 2.5 服务 3. 实验 5. 结论 0. 摘要 我们介绍 LlamaGen&…...
重新安装操作系统的软件都有哪些?
重新安装操作系统关键步骤 重新安装操作系统通常涉及到几个关键步骤:创建可启动媒体、备份现有数据、安装操作系统、以及系统初始化和配置。以下是一些常用工具和软件,它们可以帮助你完成这些步骤: 创建可启动媒体 Rufus:用于W…...
深圳水务展|2025深圳国际水务科技博览会
2025深圳国际水务科技博览会 展会主题: 新质生产力赋能水务产业高质量发展 展会时间:2025年7月24-26日 展会地点:深圳会展中心(福田) 主办单位: 广东省水利学会 深圳市水务学会 协办单位: 中国水利…...
OpenAI not returning a result?
题意:OpenAI 没有返回结果吗? 问题背景: Im trying to use the OpenAI beta but I cant seem to get a result. Im accessing the API via an NPM package (openai-api - npm). I have that setup and working but when I make a request th…...
[Windows]_[初级]_[GetVersionEx获取系统版本错误的原因]
场景 开发WTL/ATL/Win32程序时, 有时候需要获取系统版本号,以便判断用户在使用软件时的系统。在某一天突然发现获取的系统版本号是错的, 一直是版本号6.2.x,什么情况? 说明 如果软件没有针对Win8.1或Win10以上的系统做兼容处理,返回的是Wi…...
2024,Java开发在中国市场还有发展前景吗?
随着2024年的到来,Java作为一种经典而强大的编程语言,依然在中国的软件开发市场中扮演着重要角色。然而,许多人对Java的未来发展前景持有不同的看法。让我们来探讨一下当前情况和未来的走向。 Java程序员真的过剩了吗? 2023年, 各…...
gcc: string.c_str gcc-8.5的一个问题
https://en.cppreference.com/w/cpp/string/basic_string/c_str https://sourceforge.net/p/cppcheck/wiki/ListOfChecks/ common mistakes when using string::c_str()string的这个成员是返回c类型的一个字符数组指针。但是这个指针所对应的地址有赖于string对象的生命周期。所…...
一道笔试题 - 无重复字符的最长子串
老生常谈的一道题,常见并 文章目录 描述预期结果Java代码 描述 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。 预期结果 Java代码 import java.util.HashSet; import java.util.Set;public class Demo2 {public static void main(S…...
C#反射的NullReferenceException
背景 xml文件中有些元素的属性被删除,导致文件无法被读取(C#)。 调试之后发现,因为属性被删除,读进来会保持默认值null,在后续的反射中如果用这个null给字符串属性赋值,会抛异常。 另外发现前面…...
100道C/C++面试题
1. static的作用2. 引用与指针的区别3. .h头文件中的ifndef/define/endif 的作用4 #include<file.h>与#include"file.h"的区别?5 描述实时系统的基本特性6 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?7 什么是平衡二叉树?8 堆栈溢…...
Python(模块)
模块编写完成就可以被其他模块进行调用并使用被调用模块的功能。 import导入方式的语法结构: import模块名称【as别名】 from……import导入方式的语法结构: from模块名称,import变量/函数/类/*(*是通配符) impor…...
【八股文】Java基础篇
1. 和 equals的区别是什么? 判断两个变量或者实例是否都指向同一内存空间的值(不仅值相同,地址也要相同)equals是判断两个变量执行的内存空间的值是否相同(值相同,地址可以不同),所…...
python rsa如何安装
Python中的一些模块是用一个包管理器来发布的,RSA模块就是,所以首先需要安装setup tools工具。 1、下载文件:ez_setup.py 2、安装: sudo python ez_setup.py 3、下载RSA安装包:rsa-3.1.1-py2.7.egg 4、安装RSA&…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
