【Linux】进程见通信之匿名管道pipe

1.匿名管道的特点

以下管道的统称仅代表匿名管道。

  1. 管道是一个只能单向通信的通信信道。为了实现进程间通信.
  2. 管道是面向字节流的。
  3. 仅限于父子通信或者具有血缘关系的进程进行进程见通信。
  4. 管道自带同步机制,原子性写入。
  5. 管道的生命周期是随进程的。

2.匿名管道通信的四种情况

  1. 读端不读或者读的慢,写端要等读端。
  2. 读端关闭,写端收到SIGPIPE信号直接终止。
  3. 写端不写或者写的慢,读端要等写端
  4. 写端关闭,读端读完pipe内部的数据然后再读,会读到0,表示读到文件结尾。

3.pipe函数介绍

在Linux中,pipe() 是一个底层系统调用,用于创建管道(pipe)。pipe函数的使用如下:

#include<unistd.h>//使用所需包含的头文件
int pipe(int pipefd[2]);

对于参数pipefd是一个两个元素的整型数组,它是一个传出参数,用于存放管道的读写文件描述符。其中pipefd[0]为管道读端,pipefd[1]为管道写端。这两个文件描述符可以像其他文件描述符一样进行读写操作。

4.pipe函数使用示例

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>

int main()
{
	//定义pipe函数所需的pipe_fd,用来存放文件描述符。
    int pipe_fd[2] = {0};

    if(pipe(pipe_fd) < 0){
        perror("pipe");
        return 1;
    }
    printf("%d, %d\n", pipe_fd[0], pipe_fd[1]);
	
	//创建子进程
    pid_t id = fork();
    if(id < 0){
        perror("fork");
        return 2;
    }
    else if(id == 0) { //write
        //child
		//在子进程中关闭读端
        close(pipe_fd[0]);

        char c = 'x';
        int count = 0;
        while(1){
            write(pipe_fd[1], &c, 1); 
            count++;
            printf("write: %d\n", count);
        }
		//使用完结束不要忘记关闭写端!!!
        close(pipe_fd[1]);
        exit(0);
    }
    else{              //read
        //parent
		//在父进程中关闭写端
        close(pipe_fd[1]);
		
        char buffer[64];
        while(1){
            buffer[0] = 0;
			//从读端,读取sizeof(buffer)-1个字节到buffer中
            ssize_t size = read(pipe_fd[0], buffer, sizeof(buffer)-1);
            if(size > 0){//读取成功
                buffer[size] = 0;
                printf("parent get messge from child# %s\n", buffer);
            }
            else if(size == 0){
                printf("pipe file close, child quit!\n");
                break;
            }
            else{
                //TODO
                break;
            }
        }
		//定义进程等待状态,并进行进程等待
        int status = 0;
        if(waitpid(id, &status,0) > 0){
            printf("child quit, wait success!, sig: %d\n", status&0x7F);
        }
        close(pipe_fd[0]);
    }
    return 0;
}

5.从文件描述的角度深入理解匿名管道

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring 向页面传值以及接受页面传过来的参数的方式

一、从页面接收参数 Spring MVC接收请求提交的参数值的几种方法&#xff1a; 使用HttpServletRequest获取。 RequestMapping("/login.do") public String login(HttpServletRequest request){ String name request.getParameter("name") String pa…

SpringCloud简介和用处

Spring Cloud是一套基于Spring Boot的微服务框架&#xff0c;它旨在提供一种快速构建分布式系统的方法。它可以帮助开发人员构建具有高可用性、可扩展性和容错性的微服务&#xff0c;并通过Spring Boot的开发工具和库提供强大的支持。 一、简介 Spring Cloud是Spring家族中的一…

ABB YuMi协作式双臂机器人进入工厂,极大缓解劳动力短缺问题

原创 | 文 BFT机器人 日本SUS公司是一家为汽车和其他制造业提供铝框架和压铸铝部件的知名供应商&#xff0c;近年来&#xff0c;由于全球供应链面临严重中断&#xff0c;该公司希望能够寻找一家自动化供应商来帮助其恢复日本静冈县的产品生产。SUS公司表示&#xff0c;由于生产…

从遍历到A星寻路算法

在游戏当中&#xff0c;经常需要找一个点到其它点的路径。在之前的一篇博文(地图编辑器开发&#xff08;三&#xff09;)中也有使用到到A*寻路算法。我们期望能找到最短的路径&#xff0c;同时也需要考虑到查找路径的时间消耗。游戏中的地图可以图的数据结构来表示&#xff0c;…

关于优雅的使用SQL多行转多列的记录(doris)

文章目录 应用需求场景记录过程1. 准备数据2. 给数据根据姓名分组&#xff0c;加上序号.3. 根据name分组成map结构4. 拆分map 应用需求场景 准备的数据是这样的&#xff1a; 需要将每个人的成绩显示在一行上&#xff0c;需要的结果如下&#xff0c;但是我的情况是课程有非常…

代码随想录二刷 | 栈与队列 | 前 k 个高频元素

代码随想录二刷 &#xff5c; 栈与队列 &#xff5c; 前 k 个高频元素 题目描述解题思路 & 代码实现 题目描述 347.前k个高频元素 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nu…

数据库:JDBC编程

专栏目录 MySQL基本操作-CSDN博客 MySQL基本操作-CSDN博客 数据库的增删查改&#xff08;CRUD&#xff09;基础版-CSDN博客 数据库增删改查&#xff08;CRUD&#xff09;进阶版-CSDN博客 数据库的索引-CSDN博客 基本概念 JDBC编程就是通过Java代码来操作数据库 api 数据库是…

【广州华锐互动】风电场检修VR情景模拟提供接近真实的实操体验

风电场检修VR情景模拟系统由广州华锐互动开发&#xff0c;这是一种新兴的培训方式&#xff0c;它通过虚拟现实技术将风力发电场全范围进行1:1仿真建模还原&#xff0c;模拟监视风力发电场各种运行工况下的运行参数和指标&#xff0c;同时可进行升压站系统的巡视&#xff0c;倒闸…

C# 使用FluentScheduler触发定时任务

写在前面 FluentScheduler是.Net平台下的一个自动任务调度组件&#xff0c;以前经常用的是Quarz.Net&#xff0c;相对而言FluentScheduler的定时配置更为直观&#xff0c;可直接用接口进行参数化设置&#xff0c;对Cron表达式有恐惧症的人来说简直就是福音&#xff0c;使用起来…

Java网络编程,使用UDP实现TCP(一), 基本实现三次握手

简介&#xff1a; 首先我们需要知道TCP传输和UDP传输的区别&#xff0c;UDP相当于只管发送不管对方是否接收到了&#xff0c;而TCP相当于打电话&#xff0c;需要进行3次握手&#xff0c;4次挥手&#xff0c;所以我们就需要在应用层上做一些功能添加&#xff0c;如&#xff1a;…

Spring基于注解存储对象

小王学习录 前言基于注解存储对象Controller (控制器存储)Service (服务存储)Repository (仓库存储)Component (组件存储)Configuration (配置存储)Bean(方法注解) 前言 上一篇文章中已经介绍了在Spring中存储Bean和取Bean的方法. 而在 Spring 中想要更简单的存储和读取对象的…

让工作更高效,那些不能错过的8款泳道图绘制工具

在现代企业的运营管理中&#xff0c;泳道图扮演了至关重要的角色。这种独特的图表工具以其直观、清晰的特点&#xff0c;帮助我们理解和改进复杂的工作流程&#xff0c;从而提升效率。本文将为你分享8款实用且高效的泳道图绘制工具&#xff0c;它们能够帮助你轻松创建出专业级别…

Emscripten运行时

本章将简要介绍Emscripten环境下与运行时相关的部分知识&#xff0c;包括消息循环、文件系统、内存管理等内容。 main函数与生命周期 生成本地代码时&#xff0c;作为C/C程序的入口函数&#xff0c;通常main()函数意味着程序的整个生命周期&#xff0c;程序随main()函数返回的…

第二十一章网络通信总结博客

局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmission Control Protocol/I…

对Spring源码的学习:一

目录 BeanFactory开发流程 ApplicationContext BeanFactory与ApplicationContext对比 基于XML方式的Bean的配置 自动装配 BeanFactory开发流程 这里的第三方指的是Spring提供的BeanFactory&#xff0c;Spring启动时会初始化BeanFactory&#xff0c;然后读取配置清单&#…

力扣每日一题:1466. 重新规划路线(2023-12-07)

力扣每日一题 题目&#xff1a;1466. 重新规划路线 日期&#xff1a;2023-12-07 用时&#xff1a;45 m 36 s 时间&#xff1a;37ms 内存&#xff1a;69.64MB 代码&#xff1a; class Solution {public int minReorder(int n, int[][] connections) {list new List[n];Arrays…

IPTABLES(一)

文章目录 1. iptables基本介绍1.1 什么是防火墙1.2 防火墙种类1.3 iptables介绍1.4 包过滤防火墙1.5 包过滤防火墙如何实现 2. iptables链的概念2.1 什么是链2.2 iptables有哪些链 3. iptables表的概念3.1 什么是表3.2 表的功能3.3 表与链的关系 4. iptables规则管理4.1 什么是…

Shell数组函数:数组——数组和循环(二)

for脚本快速定义数组 [rootlocalhost ~]# vim for12.sh #脚本编辑 #!/bin/bash for a in cat /etc/hosts do hosts[o]$a donefor i in ${!hosts[]} do echo "$i : ${hosts[$a]}" done[rootlocalhost ~]# vim for12.sh #执行脚本区别 &#xff1a;for的空格分割…

coredump

linux原生 一、设置 $ cat /proc/sys/kernel/core_pattern 通过查看core_pattern文件&#xff0c;发现其确实指定了一个路径&#xff0c;于是我前往那个路径&#xff0c;发现竟然是脚本程序&#xff0c;后来查看说明文件&#xff0c;才知道core_pattern中如果首先指定了一个 …

docker 可视化工具操作说明 portainer

官网地址 https://docs.portainer.io/start/install-ce/server/docker/linux 1.First, create the volume that Port docker volume create portainer_data2.下载并安装容器 docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restartalways -v /var/run/docker…