进程间通信----管道篇

目录

一丶  无名管道

1.  特点

2.  读写特性

3.  函数接口

二丶有名管道

1.特点:

2.函数接口

3. 读写特性


一丶  无名管道

1.  特点

        1.  只能用于具有亲缘关系的进程之间的通信
        2.  半双工的通信模式,具有固定的读端和写端
        3.  管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数.
        4.  管道是基于文件描述符的通信方式。当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。

2.  读写特性

1.  当管道中无数据时,读操作会阻塞;
        管道中无数据时,将写端关闭,读操作会立即返回

2.  管道中装满(管道大小64K)数据写阻塞,一旦有4k空间,写继续

3.  只有在管道的读端存在时,向管道中写入数据才有意义。否则,会导致管道破裂,向管道中写入数据的进程将收到内核传来的SIGPIPE信号 (通常Broken pipe错误)。Broken pipe:管道破裂

3.  函数接口

int pipe(int fd[2])
功能:创建无名管道
参数:文件描述符 fd[0]:读端  fd[1]:写端 
返回值:成功 0失败 -1
#include <stdio.h>
#include <unistd.h>int main(int argc, char const *argv[])
{char buf[65536] = "";int fd[2] = {0}; //fd[0]代表读端,fd[1]代表写端if (pipe(fd) < 0){perror("pipe err");return -1;}printf("%d %d\n", fd[0], fd[1]);//结构类似队列,先进先出//1. 当管道中无数据时,读阻塞。// read(fd[0], buf, 32);// printf("%s\n", buf);//但是关闭写端就不一样了//当管道中有数据关闭写端可以读出数据,无数据时关闭写端读操作会立即返回。// write(fd[1], "hello", 5);// close(fd[1]);// read(fd[0], buf, 32);// printf("%s\n", buf);//2. 当管道中写满数据时,写阻塞,管道空间大小为64K// write(fd[1], buf, 65536);// printf("full!\n");//write(fd[1], "a", 1);  //当管道写满时不能再继续写了会阻塞//写满一次之后,当管道中至少有4K空间时(也就是读出4K),才可以继续写,否则阻塞。// read(fd[0], buf, 4096); //换成4095后面再写就阻塞了,因为不到4K空间// write(fd[1], "a", 1);//3. 当读端关闭,往管道中写入数据无意义,会造成管道破裂,进程收到内核发送的SIGPIPE信号。close(fd[0]);write(fd[1], "a", 1);printf("read close\n");return 0;
}
练习:父子进程实现通信,父进程循环从终端输入数据,子进程循环打印数据,当输入quit结束。

提示:不需要加同步机制, 因为pipe无数据时读会阻塞。
先创建管道再fork,这样父子进程可以使用同一个无名管道。

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>int main(int argc, char const *argv[])
{pid_t pid;char buf[32] = "";int fd[2];if (pipe(fd) < 0){perror("pipe err");return -1;}printf("%d %d\n", fd[0], fd[1]);pid = fork();if (pid < 0){perror("fork err");return -1;}else if (pid == 0) //循环打印, quit结束{while (1){read(fd[0], buf, 32); //读出管道中内容存入bufif (strcmp(buf, "quit") == 0)break;printf("%s\n", buf);//将buf内容打印到终端}}else //循环输入,quit结束{while (1){scanf("%s", buf);write(fd[1], buf, 32); //把输入buf内容写入管道if (strcmp(buf, "quit") == 0)break;}wait(NULL);}return 0;
}

二丶有名管道

1.特点:

        1.  有名管道可以使互不相关的两个进程互相通信
        2.  有名管道可以通过路径名来指出,并且在文件系统中可见,但内容存放在内存中
        3.  进程通过文件IO操作有名管道
        4.  有名管道遵循先进先出规则
        5.  不支持如lseek() 操作

2.函数接口

#include <sys/types.h>
#include <sys/stat.h>int mkfifo(const char *filename,mode_t mode);
功能:创健有名管道
参数:filename:有名管道文件名mode:权限
返回值:成功:0        爱no失败:-1,并设置errno号

示例:

对于这种情况我并不希望它直接return输出,而是我们存在这个文件,我直接就继续向下执行就可以了

解决方案:

补充:

1.  当管道文件存在(报错提示file exists)时的处理方式:
        判断errno的值为EEXIST时,只是打印提示语句,if(errno == EEXIST)
2.  注意代码中出现errno,需要添加头文件#include <errno.h>

3. 读写特性

1.  只写方式,写阻塞(阻塞在打开文件的位置),一直到另一个进程把读打开
2.  只读方式,读阻塞(阻塞在打开文件的位置),一直到另一个进程把写打开
3.  可读可写,如果管道中没有数据,读阻塞

练习:两个进程实现通信,一个进程输入字符串,另一个进程打印数据,当输入quit时结束

gcc input.c -o in 输入字符串
gcc output.c -o out 打印数据
./in ./out

有名管道和无名管道的区别:

无名管道

有名管道

使用场景

只能在亲缘关系进程

不相关的任意进程

特点

有固定的读端和写端

文件IO进行操作

先入先出原则

不支持lseek操作

存放在存储的内核空间

在文件系统中存在管道文件

文件IO进行操作

先入先出原则

不支持lseek操作

存放在存储的内核空间

操作方式

直接进行读写操作

先打开管道文件,再读写操作

函数

pipe

mkfifo

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

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

相关文章

4G手机智能遥控开关

什么是4G手机智能遥控开关 4G手机智能遥控开关作为现代智能家居与工业自动化的重要组成部分&#xff0c;提供了便捷、高效的远程控制方案。它利用4G通信技术&#xff0c;允许用户随时随地通过智能手机或其他移动设备控制电器设备的开关状态&#xff0c;适用于家庭、办公、工业等…

【Android】MotionLayout实现动画效果

【Android】MotionLayout实现开场动画 在移动应用开发中&#xff0c;动画不仅仅是美化界面的工具&#xff0c;它更是提升用户体验的关键手段。Android 平台一直以来都提供了丰富的动画框架&#xff0c;但随着应用复杂性的增加&#xff0c;开发者对动画的需求也变得更加复杂和多…

AcWing898. 数字三角形

线性DP 董晓老师的讲解是从下标0开始算的&#xff0c;其实我们从1开始也可以&#xff0c;我感觉这里从1开始更好理解。是从下往上计算的。j负责列的计算&#xff0c;往上计算时逐步收窄横向的范围&#xff0c;i是纵向的从下往上算&#xff0c; 下面是内存布局 下面是逻辑上的…

android 离线的方式使用下载到本地的gradle

1、android studio在下载gradle的时候&#xff0c;特别慢&#xff0c;有的时候会下载不完的情况&#xff0c;这样我们就要离线使用了。 2、下载Gradle Gradle | Releases 或者 Releases gradle/gradle GitHub Gradle | Releases 这里我们下载8.10 complete版本&#xff0c…

Tomcat10安装

Tomcat下载 进入官网下载https://tomcat.apache.org 注意tomcat版本和Java版本的对应关系&#xff1a; 配置好JAVA_HOME 安装tomcat前&#xff0c;需要先配置好JAVA_HOME&#xff0c;因为tomcat启动时候默认会找环境里面的JAVA_HOME&#xff0c;这里选择的Java版本是java1…

【工具篇】高效记忆方法之AnKi工具

&#x1f60a;你好&#xff0c;我是南极。正在变强的路上不断地努力着&#x1f4aa; &#x1f514;今天和大家分享一些记忆的方法&#xff0c;以及推荐了一款用于复习和巩固知识的软件AnKi。 对我们程序员而言&#xff0c;平常学习的东西会比较多&#xff0c;有时呢学的东西会…

结合代码详细讲解DDPM的训练和采样过程

本篇文章结合代码讲解Denoising Diffusion Probabilistic Models&#xff08;DDPM&#xff09;&#xff0c;首先我们先不关注推导过程&#xff0c;而是结合代码来看一下训练和推理过程是如何实现的&#xff0c;推导过程会在别的文章中讲解&#xff1b;首先我们来看一下论文中的…

<C++> AVLTree

目录 1. AVL概念 2. AVL树节点的定义 3. AVL树的插入 4. AVL树的旋转 5. AVL树的验证 6. AVL树的删除 7. AVL树的性能 暴力搜索、二分搜索、二叉搜索树、二叉平衡搜索树&#xff08;AVL、红黑树&#xff09;、多叉平衡搜索树&#xff08;B树&#xff09;、哈希表 1. AVL概念 二…

【C++ Primer Plus习题】7.2

问题: 解答: #include <iostream> using namespace std;#define MAX 10int input(float* grade, int len) {int i 0;for (i 0; i < len; i){cout << "请输入第" << i 1 << "个高尔夫成绩(按0结束):";cin >> grade[i]…

更改了ip地址怎么改回来

在日常的网络使用中&#xff0c;‌我们有时会因为特定的需求更改设备的IP地址&#xff0c;‌比如解决IP冲突、‌访问特定网络资源或进行网络测试等。‌然而&#xff0c;‌更改IP地址后&#xff0c;‌我们可能又因为某些原因需要将IP地址改回原来的设置。‌本文将详细介绍如何改…

视频号单场直播GMV超500万!开学季助力品牌高效转化

开学在即&#xff0c;友望数据发现&#xff0c;不少学习机、学练机、智能机器人、词典笔等学习相关的电子教育产品开始畅销 ▲ 图片来源&#xff1a;友望数据-商品排行榜 新学年开始&#xff0c;家长们又要为孩子新的学业操碎心&#xff0c;而教育培训商家也在开学季迎来了他们…

PS如何抠人像图--5步实现完美抠图

1、菜单栏--选择--选择主体 2、菜单栏--选择--选择并遮住 3、选择原图--右下角添加纯色背景 4、文件--导出--导出为png图片 5、原图与抠图效果对比 相关参考视频&#xff1a; 【ps教程】揭秘PS抠头发&#xff0c;这才是真正的教学&#xff0c;快收藏吧_哔哩哔哩_bilibili 一分…

挂载5T大容量外接硬盘到ubuntu

挂载5T大容量外接硬盘到ubuntu S1&#xff1a;查看硬盘 使用 $ sudo fdisk -l找到对应盘&#xff0c;例如下图所示 /dev/sdc S2: 创建分区 使用 $ sudo fdisk /dev/sdc对上硬盘进行创建分区&#xff1b;可以依次使用以下指令 m &#xff1a;查看命令&#xff1b; g &…

从开题到答辩:ChatGPT超全提示词分享!(下)【建议收藏】

数据收集 1. "请帮我找出关于如何收集【研究领域】社交媒体数据进行消费者行为研究的五篇指导性文章&#xff0c;并概述它们的主要方法论摘要。" 2. "我需要对【特定领域】市场的消费者偏好进行调查。能否提供一份包含调查问卷设计原则和示例的草稿&#xff1f;…

cola_os学习笔记(下)

cola_os学习笔记&#xff08;上&#xff09; os文件夹 cola_device.c ​ .h放在.c的同层级。作者采用了字符设备注册的方式&#xff0c;在.h中可以看到设备属性。也就是把LED这些设备抽象&#xff0c;外面传入"LED1"这样的参数&#xff0c;使我联想到java的new一个…

编译错误cc:not found总结

一、错误 cc: not found 系统无法找到名为cc的编译器。 注&#xff1a;在大多数Linux系统中&#xff0c;cc通常是C编译器的链接&#xff08;link&#xff09;或别名&#xff0c;它通常指向gcc&#xff08;GNU Compiler Collection&#xff09;或其他C编译器。 二、可能导致…

「OC」CAlayer——巧用动画实现一个丝滑的折叠cell

「OC」CAlayer——巧用动画实现一个丝滑的折叠cell 前言 在这个暑假集训后的时间&#xff0c;都在家里做着学习笔记的整理&#xff0c;深入学习了CALayer的相关知识&#xff0c;掌握了第三方库Masonry自动布局的用法&#xff0c;以及学习了MVC的相关内容&#xff0c;正好组内…

chapter08-面向对象编程——(Object类详解)——day09

目录 319-运算符 320-查看Jdk源码 321-子类重写equals 322-equals课堂练习1 323-equals重写练习2 324-equals重写练习3 325-hashCode 326-toString 327-finalize 319-运算符 引用的都是同一个地址&#xff0c;所以返回true 320-查看Jdk源码 equals只能判断引用类型是…

艾体宝干货丨Redis与MongoDB的区别

Redis&#xff08;Remote Dictionary Server&#xff0c;远程字典服务器&#xff09;和 MongoDB 是两类知名的 NoSQL数据库&#xff0c;其以非结构化的方式存储数据。与传统关系数据库使用表格、行和列来组织数据不同&#xff0c;NoSQL数据库采用了不同的数据存储模型。Redis是…

探索极速Python:Sanic框架的魔力

文章目录 探索极速Python&#xff1a;Sanic框架的魔力背景&#xff1a;为什么选择Sanic&#xff1f;Sanic是什么&#xff1f;如何安装Sanic&#xff1f;简单的库函数使用方法场景应用示例常见Bug及解决方案总结 探索极速Python&#xff1a;Sanic框架的魔力 背景&#xff1a;为什…