实验名称:基于C/S的命名管道通信

news2024/12/29 16:28:51

实验名称:基于C/S的命名管道通信

相关知识

无名管道

无名管道(匿名管道)用于具有亲缘关系进程间的通信,其特点有

  • 管道是半双工的,数据单向流动(双方通信需建立两个通道)
  • 管道只能用于父子进程或兄弟进程之间
  • 对通信进程而言,管道就是一个文件
  • 写管道添加在管道缓冲区的末尾,读管道则从缓冲区头部读出

无名管道的创建函数:

#include<unistd.h>
int pipe(int filedes[2]);

无名管道有一个读端一个写端,通过filedes参数传出给用户程序两个文件描述符:filedes[0]指向管道的读端,filedes[1]指向管道的写端。

管道在用户程序看起来就像一个打开的文件,通过read(filedes[0])write(filedes[1])向这个文件读写,它们本质上其实是在读写内核缓冲区。pipe函数调用成功返回0,否则返回-1

命名管道

命名管道也被称为FIFO文件,它是一种特殊的文件,在文件系统中以文件名的形式存在。

Linux中所有事物都可被视为文件,所以对命名管道的使用也就变得与文件操作非常的统一,我们可以像平常的文件名一样在命令中使用。

管道中的读写规则:
(1)读一个写端关闭的管道,在所有数据读完之后,read返回0,以指示文件到结尾处
(2)如果写一个读端已关闭的管道,则产生SIGPIPE信号,捕捉信号write出错返回
(3)互斥与原子性,在写的时候,读端不允许访问管道,并且已写尚未读取的字节数应该小于或等于PIPE_BUF所规定的缓存大小

实验内容

编写server和client两个程序,利用命名管道实现两个进程间的消息互通。

通过mkfifo(const char*pathname, mode_t mode)函数来创建命名管道,其中pathname代表要创建的或打开的文件名,mode表示存取访问权限。

  1. 编写服务端程序server.c
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
# define FIFO "/tmp/myfifo" //管道文件存放位置
int main()
{
        char buf_r[100];//固定大小的缓冲数组
        int fd;
        int nread;
        if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))//创建命名管道
                printf("cannot create fifoserver\n");
        printf("preparing for reading bytes......\n"); //success to create the pipe
        memset(buf_r,0,sizeof(buf_r)); //初始化内存区域
        fd=open(FIFO,O_RDONLY|O_NONBLOCK,0664);//以只读和非阻塞的方式打开管道
        if(fd==-1) //判断是否打开成功
        {
                perror("failed to open\n");
                exit(1); //非正常突出程序
        }
        while(1){ //循环反复读取客户端发送的数据
                memset(buf_r,0,sizeof(buf_r)); //初始化内存区域
                if((nread=read(fd,buf_r,100))==-1) //读取管道中的数据,将数据存放在缓冲区buf_r中,直到读取结束
                {
                        if(errno==EAGAIN) //pipe is empty?
                                printf("no data yet!\n");
                }
                printf("read %s from FIFO\n",buf_r); //print the data
                sleep(1);
        }
        pause(); //wait the signal
        unlink(FIFO); //delete the file
        return 0;
}
  1. 编写客户端程序client.c
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#define FIFO "/tmp/myfifo"
int main(int argc,char**argv)
{
        int fd;
        char w_buf[100];//buffer for writing
        int nwrite;
        fd=open(FIFO,O_WRONLY|O_NONBLOCK,0);
        if(argc==1) //判断是否有发送数据
        {
                printf("please send something!\n");
                exit(-1);
        }
        strcpy(w_buf,argv[1]); //将要发送的内容复制给写缓冲区
        if((nwrite=write(fd,w_buf,100))==-1) //send the data to pipe
        {
                if(errno==EAGAIN) //judge whether the data is read
                    printf("the FIFO has not been read yet. please try later!\n");
        }
        else
                printf("write %s to the FIFO.\n",w_buf);//success to send
        return 0;
}
  1. 运行程序(server和client两个进程)
    在这里插入图片描述

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

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

相关文章

2023年房地产投资-租金和IRR研究报告

第一章 概况 房地产投资租赁是指置业投资者在购买到物业后&#xff0c;首先对该物业进行适当整饰与装修&#xff0c;之后以出租人的身份&#xff0c;以口头协议或签订合同的形式&#xff0c;将房屋交付承租人占有、使用与收益&#xff0c;由承租人向出租人交付租金的行为。通过…

第一章 企业管理概论

目录 一、企业及其形式 二、企业管理概述 三、企业管理理论与实践的产生与发展 四、网络时代的企业环境 五、网络时代企业管理的变革 一、企业及其形式 1、企业的概念 企业以市场为导向&#xff0c;以价值增值作为经济活动的目的&#xff1b; 企业是从事商品生产和流通的…

BUG解决:微信小程序调用vantweapp遮罩层popup 更改show后没反应,弹框/遮罩层不隐藏,show失效

一、bug复现&#xff1a;引入popup组件&#xff0c;时间选择组件json>"usingComponents": {"van-datetime-picker": "vant/weapp/datetime-picker/index","van-popup": "vant/weapp/popup/index"}页面想实现&#xff0c;…

当我以为z-library已死的时候 它居然又活了?!!

z-library 全世界最大的图书馆What Happened To Z-lib?zlib的复活只是暂时的deepweb会让zlib得到永生&#xff01;真心祝愿zlib的Plans for 2023能够实现What Happened To Z-lib? 这是曾经的zlib&#xff0c;域名是z-lib.org&#xff0c;然而现在死了&#xff08;22年11月时…

Grafana 系列文章(十三):如何用 Loki 收集查看 Kubernetes Events

前情提要 IoT 边缘集群基于 Kubernetes Events 的告警通知实现IoT 边缘集群基于 Kubernetes Events 的告警通知实现&#xff08;二&#xff09;&#xff1a;进一步配置 概述 在分析 K8S 集群问题时&#xff0c;Kubernetes Events 是超级有用的。 Kubernetes Events 可以被当…

Windows 10 Creators版本中的11个大亮点

导读微软在近日公布了有关明年Windows 10更新部分的大量功能&#xff0c;但该公司在其Creators更新版本中悄悄隐藏了远超出11项新的功能。其实&#xff0c;在这个更新包中还将包含许多内容&#xff0c;包括增加一个新的应用程序&#xff0c;以及针对Edge浏览器、地图应用程序和…

蓝牙耳机什么牌子好用又便宜?好用不贵的蓝牙耳机推荐

随着时代的进步&#xff0c;数码产品在人们日常生活中的使用频率越来越高&#xff0c;一部手机&#xff0c;一副耳机似乎已然成为人们出行必备。蓝牙耳机的发展速度很快&#xff0c;在众多的蓝牙耳机牌子中&#xff0c;什么牌子好用又便宜&#xff1f;下面&#xff0c;我来给大…

MySQL的四种安装

一、仓库安装 1、添加MySQL仓库 将MySQL-Yum存储库添加到系统的存储库列表中。这是一个一次性操作&#xff0c;可以通过安 装MySQL提供的RPM来执行。转到MySQL Yum存储库页面在MySQL开发板块。可以通过Web下载然后转到自己的RHEL9.1虚拟机上&#xff1b;也可以使用RHEL9上使用…

Java常见关键字总结

final,static,this,super 关键字总结 final 关键字static 关键字this 关键字super 关键字参考 static 关键字详解 static 关键字主要有以下四种使用场景 修饰成员变量和成员方法(常用)静态代码块静态内部类静态导包 补充内容 静态方法与非静态方法static{}静态代码块与{}非静态…

apache和nginx的TLS1.0和TLS1.1禁用处理方案

1、TLS1.0和TLS1.1是什么&#xff1f; TLS协议其实就是网络安全传输层协议&#xff0c;用于在两个通信应用程序之间提供保密性和数据完整性&#xff0c;TLS 1. 0 和TLS 1. 1 是分别是96 年和 06 年发布的老版协议。 2、为什么要禁用TLS1.0和TLS1.1传输协议 TLS1.0和TLS1.1协…

项目实战-NewFixedThreadPool线程池

目录 什么是线程池 线程池的类型 1.CachedThreadPool 2.FixedThreadPool 3.ScheduledThreadPool 4.SingleThreadPool 5.newWorkStealingPool 线程池的好处 1、线程池的重用 2、控制线程池的并发数 3、线程池可以对线程进行管理 线程池的示例 1.Client启动类 2.具体…

Linux中man手册的使用

在linux中&#xff0c;不管是库函数还是系统调用&#xff0c;都用到man手册来查看函数的三要素(功能、参数、返回值)&#xff0c;这里就详细的介绍一下man手册的使用。这里需要注意的是&#xff1a;对于初学者来说,不能将手册页当教程&#xff0c;因为它只是简明的参考资料. Li…

Linux进程控制详解

目录前言一、进程创建1.1 fork函数初识1.2 写时拷贝1.3 fork常规用法1.4 fork调用失败的原因二、进程终止2.1 进程终止时&#xff0c;操作系统做了什么&#xff1f;&#xff1f;2.2 进程终止的常见方式有哪些&#xff1f;&#xff1f;2.3 如何用代码终止一个进程三、进程等待3.…

Linux学习之操作系统认识

目录操作系统概念初识“管理”总结系统函数和库函数操作系统 概念 操作系统&#xff08;英语&#xff1a;Operating System&#xff0c;缩写&#xff1a;OS&#xff09;是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件…

了解并发编程

并发与并行的概念: 并发:一段时间内(假设只有一个CPU)执行多个线程,多个线程时按顺序执行 并行:同个时间点上,多个线程同时执行(多个CPU) 什么是并发编程? 在现代互联网的应用中,会出现多个请求同时对共享资源的访问情况,例如在买票,秒杀与抢购的场景中 此时就会出现线程安…

【排序算法】选择排序(Selection sort)

选择排序(Selection sort)是一种简单直观的排序算法。选择排序介绍它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素&#xff0c;然后将其存放到数列的起始位置&#xff1b;接着&#xff0c;再从剩余未排序的元素中继续寻找最小(or最大)元素&#xff0c;然后放到已排…

c/c++开发,无可避免的宏定义使用案例

一、c/c宏定义的来源 宏定义&#xff0c;就是用一个标识符来表示一个字符串&#xff0c;如果在后面的代码中出现了该标识符&#xff0c;那么就全部替换成指定的字符串。通常c/c宏定义这几处出处&#xff1a; 1&#xff09;最常见的就是来自于开发者编码过程中采用宏定义命令“#…

发烧友实测 | 飞凌嵌入式OKA40i-C开发板试用体验之远程视频监控

本篇试用报告由发烧友zealsoft提供&#xff0c;感谢zealsoft的支持。飞凌嵌入式会在电子发烧友和电路城论坛持续开展开发板有奖试用活动&#xff0c;更有京东E卡等着你&#xff01;欢迎大家的持续关注。“感谢飞凌嵌入式公司提供了本次OKA40i-C开发板的评测机会。上次我们介绍了…

网络流量传输MTU解析

基本概念 以太网的链路层对数据帧的长度会有一个限制&#xff0c;其最大值默认是1500字节&#xff0c;链路层的这个特性称为MTU&#xff0c;即最大传输单元 Maximum Transmission Unit&#xff0c;最大传输单元&#xff0c;指的是数据链路层的最大payload&#xff0c;由硬件网…

高压放大器在孔道灌浆非线性超声测试中的应用

实验名称&#xff1a;高压放大器在孔道灌浆非线性超声测试中的应用研究方向&#xff1a;无损检测测试目的&#xff1a;超声波作为频率高于20kHz的声波被广泛应用于各类结构的无损检测中&#xff0c;以超声波作为探伤波的无损检测法称为超声波无损检测法&#xff0c;简称超声波法…