Linux进程间通信学习记录(无名管道)

0.Linux进程间通信的方式

(1).从UNIX继承过来的通信方式

                无名管道(pipe)

                有名管道(fifo)

                信号(signal)

(2).System V IPC

                共享内存

                消息队列

                信号灯集

(3).套接字

一.无名管道介绍

1.特点

        ①.无名管道只能用于有亲缘关系的进程之前的通信(父子进程、兄弟进程等)

        ②.单工的通信模式,数据流是单方向的。有固定的读端写端

        ③.无名管道创建时会返回两个文件描述符,分别用于读和写。即读写的文件描述符是分开

        ④.管道中的内容被读走后,就相当于流出去了,之后管道中就没有数据了。

        ⑤.若要实现双工通信,则可以创建两个数据流方向相反的无名管道。

2.读无名管道

(1).写端存在时

        ①.管道内有数据时,读端调用read()函数,返回值是实际读到的字节数。

        ②.管道内没有数据时,读端调用read()会阻塞等待,直到管道内有数据。

(3).写端不存在时

       ①.管道内有数据时,读端调用read()函数,返回值是实际读到的字节数。

        ②.管道内没有数据时,读端调用read()函数,会立刻返回0。

3.写无名管道

(1).读端存在(有进程可以读管道)

                ①.有空间时,write()返回实际写入的字节数。

                ②.空间不足时,假设管道内剩余128个字节空间可以写入,但是write()里面要写256             个字节,进程会先写入128个字节,等到(写操作进行阻塞)管道有空间了再继续写入。

(2).读端不存在(没有进程可以读管道)

                ①.管道会断裂,即会被信号结束。

二.无名管道C函数

1.无名管道的创建 - pipe

功能

        创建一个无名管道;

        成功时返回(0),失败返回(EOF)

参数

        pfd[2]:用来保存无名管道的读端和写端的文件描述符

                pfd[0]:用于管道

                pfd[1]:   用于管道

int pipe(int pfd[2]);

三.无名管道代码示例

功能

        子进程1和子进程2分别向管道中写入数据;父进程读去管道数据

1.流程图

2.代码

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>int main(void)
{pid_t pid1,pid2;        //用于创建两个子进程int pfd[2];             //读管道和写管道的文件描述符char buf[32];           //缓冲区/* 1.创建无名管道 */if(0 > pipe(pfd)){perror("pipe error");exit(-1);}/* 2.创建子进程1 */pid1 = fork();switch(pid1){case -1:printf("fork pid1 error\n");exit(-1);break;/* 子进程1  */case 0:strcpy(buf,"this is process1");write(pfd[1],buf,32);exit(0);break;/* 父进程 */default:/* 3.创建子进程2 */pid2 = fork();switch(pid2){case -1:printf("fork pid2 error\n");exit(-1);break;/* 子进程2  */case 0:sleep(1);       //让子进程1先完成操作strcpy(buf,"this is process2");write(pfd[1],buf,32);break;/* 父进程 */default:/* 4.阻塞等待回收子进程 */wait(NULL);/* 5.读管道 */read(pfd[0],buf,32);printf("%s\n",buf);wait(NULL);read(pfd[0],buf,32);printf("%s\n",buf);break;}break;}return 0;}

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

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

相关文章

Python环境安装及PIP安装(Mac OS版)

官网 https://www.python.org/downloads/ 安装python python-3.12.1-macos11.pkg下载后&#xff0c;安装一直下一步即可 验证是否安装成功&#xff0c;执行python3命令和pip3命令 配置环境变量 获取python3安装位置并配置在.bash_profile #查看python路径 which python3#…

centos8以上系统安装docker环境

由于docker官方更新了相关镜像路由&#xff0c;导致国内用户无法正常手段安装使用docker&#xff0c;本人推荐使用下面操作进行安装。 1.docker-ce安装 # 添加docker-ce仓库&#xff0c;本次使用的是阿里云的仓库 dnf config-manager --add-repo https://mirrors.aliyun.com/do…

CoCoOp(论文解读):Conditional Prompt Learning for Vision-Language Models

摘要 随着预训练的视觉语言模型&#xff08;如 CLIP&#xff09;的兴起&#xff0c;研究使这些模型适应下游数据集的方法变得至关重要。最近CoOp方法将NLP领域中的提示学习引入到视觉领域中&#xff0c;来调整预训练的视觉语言模型。具体来说&#xff0c;CoOp 将提示中的上下文…

【C语言初阶】C语言指针全攻略:解锁C语言深层奥秘的钥匙

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言操作符 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀指针 &#x1f4d2;1. 指针和指…

前端各种文本文件预览 文本编辑excel预览编辑 pdf预览word预览 excel下载pdf下载word下载

前端各种文本文件预览 文本编辑excel预览编辑 pdf预览word预览 excel下载pdf下载word下载 各种文本文件预览&#xff08;pdf, xlsx, docx, cpp, java, sql, py, vue, html, js, json, css, xml, rust, md, txt, log, fa, fasta, tsv, csv 等各种文本文件&#xff09; 其中 除p…

C 408—《数据结构》算法题基础篇—数组(通俗易懂)

目录 Δ前言 一、数组的合并 0.题目&#xff1a; 1.算法设计思想&#xff1a; 2.C语言描述&#xff1a; 3.算法的时间和空间复杂度 : 二、数组元素的倒置 0.题目 : 1.算法设计思想 : 2.C语言描述 : 3.算法的时间和空间复杂度 : 三、数组中特定值元素的删除 0.题目 : …

SpringBoot3 + Flowable7 工作流引擎使用笔记

目录 Flowable 简介流程设计器安装使用 SpringBoot 3 整合表结构流程部署启动流程流程审批流程挂起和激活任务分配固定分配表达式分配值表达式方法表达式 监听器分配 流程变量运行时变量历史变量 身份服务候选人拾取任务归还任务指派给别人候选人组创建用户创建用户组用户关联用…

VueUse 基于 Vue 3 Composition API 的高质量 Hooks 库

VueUse 是什么? VueUse 是基于 Vue 3 Composition API 的高质量 Hooks 库。例如获取滚动的距离 VueUse 官网:VueUse | VueUse VueUse 什么使用? 1、通过npm安装 VueUse npm i @vueuse/core 2、搜索需要使用的函数,例如搜索 useScroll 滚动 3、使用useScroll 滚动函数 …

C语言传递指针给函数

C 语言允许您传递指针给函数&#xff0c;只需要简单地声明函数参数为指针类型即可。 下面的实例中&#xff0c;我们传递一个无符号的 long 型指针给函数&#xff0c;并在函数内改变这个值 实例1&#xff1a;获取系统的时间值 能接受指针作为参数的函数&#xff0c;也能接受数…

为什么Pandas是最流行的Python数据分析库?

本文将从Python生态、Pandas历史背景、Pandas核心语法、Pandas学习资源四个方面去聊一聊Pandas&#xff0c;期望能带给大家一点启发。 一、Python生态里的Pandas 五月份TIOBE编程语言排行榜&#xff0c;Python追上Java又回到第二的位置。Python如此受欢迎一方面得益于它崇尚简…

零成本 API 服务搭建,用 GitHub Actions 自动爬取文章?

前言 本着将成本降到最低&#xff0c;我目前做的应用或小程序都是单机的&#xff0c;也就是不用请求接口&#xff0c;只要一上架就没有任何支出。但是写死的数据毕竟有限&#xff0c;应用的内容单一无法紧跟时事热点&#xff0c;每次打开一个样&#xff0c;自然就没有留存。遇…

Redis13-多级缓存

目录 概述 JVM进程缓存 Caffeine 实现进程缓存 Lua语法 初识Lua 变量和循环 Lua的数据类型 声明变量 循环 条件控制、函数 函数 条件控制 实现多级缓存 安装OpenResty OpenResty快速入门 请求参数处理 查询Tomcat 发送http请求的API 封装http工具 CJSON工…

CSS小玩意儿:文字适配背景

一&#xff0c;效果 二&#xff0c;代码 1&#xff0c;搭个框架 添加一张背景图片&#xff0c;在图片中显示一行文字。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" conte…

【Python】高效的Web自动化测试利器—Python+Playwright快速上手自动化实战指南(限时开放)

文章目录 前言一.playwright是什么二.python引入playwright1.安装2.playwright命令行参数3.playwright codegen自动生成代码4.Chrome和Chromium有什么关系&#xff1f; 三.基本概念1. 无头浏览器&#xff08;Headless Browser&#xff09;2.同步和异步模式操作playwright2.1.同…

SQL每日一练-0815

今日SQL题难度&#xff1a;&#x1f31f;☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个产品类别在每个月的总销售额和总销量。找出每个月销售额最高的产品类别&#xff0c;显示类别名称、销售月份、总销售额和总销量。 2、表和虚拟数据 现有两个表&#xff1a;Products 和…

RockerMQ学习

消息中间件以前常用RabbitMQ和ActiveMQ&#xff0c;由于业务需要&#xff0c;后期业务偏向大数据&#xff0c;现着重学习一下RocketMQ&#xff08;RocketqMQ原理同ctg-mq&#xff09;&#xff0c;后续更新Kafka 一、RocketMQ特性 Kafka特性 &#xff08;高性能分布式&#xff…

day34-nginx常用模块

## 0. 网络面试题 网络面试题: TCP三次握手 TCP四次挥手 DNS解析流程 OSI七层模型 抓包工具 tcpdump RAID级别区别 开机启动流程 如何实现不同的网段之间通信(路由器) ip route add 192.168.1.0 255.255.255.0 下一跳的地址或者接口 探测服务器开启了哪些端口(无法登录服务器…

渗透测试-行业术语

1.肉鸡 肉鸡用来比喻哪些可以随意被我们控制的计算机&#xff0c;可以是普通的个人电脑&#xff0c;也可以是大型服务器或者其他网络设备&#xff0c;我们可以像操作自己的电脑一样操作他们而不被发觉。 2.木马 表面上伪装成了正常程序&#xff0c;但是当程序被运行的时候&a…

配置MySQL主从,配置MySQL主主 +keeplive高可用

在大数据-Hadoop体系中 配置MySQL主主keeplive高可用 注意&#xff1a;这个是我两年前的word文档&#xff0c;可以当作参考文档有个思路参考一下&#xff0c;但是里面可能有些地方有误 另外 :关于一些企业级实战技术可以参考这篇mysql 物理备份 MySQL 全量备份 增量备份 差异…

Linux_vi vim的使用

目录 vi和vim的基本介绍 vi和vim常用的三种模式 案例演示 vim的快捷键 快捷键使用练习 vi和vim的基本介绍 linux系统内会内置vi文本编译器。vim可以简单认为是vi的增强版本。 vi和vim常用的三种模式 有正常模式&#xff0c;移动光标&#xff0c;删除字符等。插入模式可以进…