Linux系统编程——管道

news2024/11/30 11:34:20

文章目录

  • 一、管道
    • 1.管道的特质
    • 2.管道的用法——pipe函数
    • 3.管道的读写行为
    • 4..管道的优劣
  • 二.实战练习:实现ls | wc -l 指令
  • 三、fifo实现非血缘关系进程间通信


一、管道

1.管道的特质

  • 实现原理:
    内核借助环形队列机制,使用内核缓冲区实现。

  • 特质:
    1.伪文件
    2.管道中的数据只能一次读取。
    3.数据在管道中,只能单向流动。

  • 局限性:
    1.自己写,不能自己读。
    2.数据不可以反复读。
    3.半双工通信。
    4.血缘关系进程间可用。

2.管道的用法——pipe函数

  • 用处:
    创建并打开管道

  • int pipe(int fd[2]);

  • 参数:
    fd[0]:读端
    fd[1]:写端

  • 返回值:
    成功 0
    失败:-1 error
    在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<pthread.h>
void sys_err(const char *str)
{
	perror(str);
	exit(1);
}
int main(int argc,char *argv[])
{
	int ret;
	int fd[2];
	pid_t pid;
	
	char *str = "hello pipe\n";
	char buf[1024];
	
	ret = pipe(fd);
	if(ret == -1)
		sys_err("pipe error");
	pid = fork();
	if(pid > 0){
		close(fd[0]);
		write(fd[1],str,strlen(str));
		close(fd[1]);
	}else if(pid == 0){
		close(fd[1]);
		ret = read(fd[0],buf,sizeof(buf));
		write(STDOUT_FILENO,buf,ret);
		close(fd[0]);
	}
	return 0;
}

3.管道的读写行为

读管道:

  • 1.管道有数据,read返回实际读到的字节数。
  • 2.管道无数据:
    1)无写端,read返回0(类似读到文件尾)
    2)有写端,read阻塞等待。

写管道:

  • 1.无读端,异常终止。(SIGPIPE导致的)
  • 2.有读端:
    1)管道已满,阻塞等待
    2)管道未满,返回写出的字节个数。

4…管道的优劣

  • 优点:
    简单,相比信号,套接字实现进程间通信,简单很多。
  • 缺点:
    1.只能单向通信,双向通信需建立两个管道。
    2.只能用于歌子、兄弟进程(有共同祖先)间通信。该问题后来使用fifo有名管道解决。

二.实战练习:实现ls | wc -l 指令

  • 该指令功能:
    统计目录中的文件数
  • 所需函数:
    创建管道函数pipe();
    创建子进程函数fork();
    执行系统级函数(接管子进程函数)execlp();
    重定向函数dup2();
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<pthread.h>
void sys_err(const char *str)
{
	perror(str);
	exit(1);
}
int main(int argc,char *argv[])
{
	int fd[2];
	int ret;
	pid_t pid;
	ret = pipe(fd);
	if(ret == -1){
		sys_err("pipe error");
	}
	pid = fork();
	if(pid == -1){
		sys_err("fork error");
	}else if(pid > 0){		//父进程执行wc -l
		close(fd[1]);
		dup2(fd[0],STDIN_FIFLENO);
		execlp("wc","wc","-l",NULL);
	}else if(pid == 0){
		close(fd[0]);
		dup2(fd[1],STDOUT_FIFLENO);
		execlp("ls","ls",NULL);
		//不能用close,因为execlp走了就不回来了
	}
	return 0;
}

三、fifo实现非血缘关系进程间通信

先当于先创建管道文件
在对文件进行读写操作
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

接口测试 Mock 实战(二) | 结合 jq 完成批量化的手工 Mock

一、应用背景因为本章的内容是使用jq工具配合完成&#xff0c;因此在开始部分会先花一定的篇幅介绍jq机器使用&#xff0c;如果读者已经熟悉jq&#xff0c;可以直接跳过这部分。先来看应用场景&#xff0c;App 经常会有一些信息展示的列表页&#xff0c;比如商家的菜品、股票的…

真无线蓝牙耳机怎么选?分体式蓝牙耳机选购攻略及推荐

近年来&#xff0c;随着智能手机终端市场的崛起&#xff0c;无线蓝牙耳机的产销也随之呈持续增长的态势。真无线蓝牙耳机凭借其时尚、便捷性&#xff0c;迅速成为年轻人出门必备的数码单品之一。蓝牙耳机经过多年发展&#xff0c;其产品种类、品牌型号数不胜数。导致&#xff0…

springboot监听器的使用(ApplicationListener、SmartApplicationListener、@EventListener)

目录前言1. ApplicationListener1. 简单的全局监听2. 定时任务3. 监听自定义事件2. SmartApplicationListener1. 简单使用2. 方法介绍3. EventListener前言 监听器&#xff1a; 当某个事件触发的时候&#xff0c;就会执行的方法块。 springboot提供了两个接口来实现监听&…

Paddle进阶实战系列(一):保险文本视觉认知问答

保险文本视觉认知问答 1.项目介绍 1.1背景 随着人工智能技术的逐渐成熟&#xff0c;计算机视觉、语音、自然语言处理等技术在金融行业的应用从广度和深度上都在加速&#xff0c;这不仅降低了金融机构的运营和风险成本&#xff0c;而且有助于提升客户的满意度&#xff0c;比如…

Rhec第二次作业

两台机器&#xff1a;第一台机器作为客户端&#xff0c;第二台机器作为服务器&#xff0c;在第一台使用rhce用户免密登录第二台机器准备两台虚拟机并保证可以ping通网络&#xff0c;ip地址不一样第一台机器配置创建rhce用户在rhce用户上&#xff0c;创建密钥对并将公钥发送给第…

JDK源码(二)ConcurrentHashMap-JDK1.7

1.背景 并发编程中&#xff0c;ConcurrentHashMap是一个使用度非常高的数据结构。 优点: 线程安全相比于HashTable和Collections.synchronizedMap()效率高&#xff0c;使用了分段锁技术。 2.ConcurrentHashMap数据结构 Segment Segment继承了ReentrantLock&#xff0c;所以它…

Java设计模式-桥接模式Bridge

传统模式 案例 要求对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网&#xff0c;打电话等)&#xff0c;如图: 类图 问题 扩展性问题(类爆炸)&#xff0c;如果我们再增加手机的样式(旋转式)&#xff0c;就需要增加各个品牌手机的类&#xff0c;同样如果我们…

【Kotlin】标准库函数 ① ( apply 标准库函数 | let 标准库函数 )

文章目录一、apply 标准库函数二、let 标准库函数Kotlin 语言中 , 在 Standard.kt 源码中 , 为所有类型定义了一批标准库函数 , 所有的 Kotlin 类型都可以调用这些函数 ; 一、apply 标准库函数 Kotlin 标准库函数 中的 apply 函数 , 该函数可以看作 实例对象 的 配置函数 , 传…

现货黄金术语汇总

有的投资者可能并不是新手&#xff0c;可能之前对股票投资的一些术语有一定的了解甚至说是经验。但是转到现货黄金市场的时候&#xff0c;还是对很多术语感到很陌生&#xff0c;下面小编针对一些与股票不一样的现货黄金术语进行介绍&#xff0c;希望可以帮助投资者们尽快"…

前言技术之swagger

一.前后端分离的特点前后端分离是的前端与后端之间的职责更加明确 后台&#xff1a; 负责业务处理 前端&#xff1a; 负责显示逻辑 在这种情况下&#xff0c;前端和后端可以分别交付给专业的开发人员去做&#xff0c;所以是必须要定义前后端直接的对接 接口&#xff0c;否则各自…

liblas读取点云,设置半透明

一&#xff0c;用Liblas读取点云数据&#xff0c;获取点云位置和颜色 二&#xff0c;将点云位置和颜色分别代入geode的位置数组和颜色数组 三&#xff0c;用glsl设置半透明。需要注意的是 1&#xff0c;颜色数组是用attribute,所以要用 geom->setVertexAttribArray(10, colo…

Wireshark抓包分析DHCP

1、DHCP简介动态主机设置协议&#xff08;英语&#xff1a;Dynamic Host Configuration Protocol&#xff0c;DHCP&#xff09;是一个局域网的网络协议&#xff0c;使用UDP协议工作&#xff0c;主要有两个用途&#xff1a;用于内部网或网络服务供应商自动分配IP地址&#xff1b…

从0到1完成一个Vue后台管理项目(十五、作业列表、表格数据方法的封装)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

解决虚拟机安装 VMware Tools 灰色无法点击问题

环境&#xff1a; 主机 OS: Windows 11 虚拟机平台: VMware Workstation 17 Pro 虚拟系统: Ubuntu 22.04 1. 问题 安装好 Linux 系统后&#xff0c;想要适配桌面大小等其它功能就需要安装 VMware Tools 这个工具&#xff0c;最简单的办法就是通过虚拟机平台的 “一键安装”&a…

Java之ATM系统

目录项目介绍系统准备&#xff0c;首页设计总结开户功能总结用户登录总结用户操作页设计、查询账户、退出账户功能用户存钱取款功能转账功能密码修改、销户源代码项目介绍 系统准备&#xff0c;首页设计 总结 1、用户的账户信息&#xff0c;系统如何表示的? 定义账户类Accoun…

【CVHub】现代目标检测故事 | 40+目标检测网络架构大盘点!从基础架构ResNet到最强检测器Yolov7再到最新部署神器GhostNetV2

本文来源“CVHub”公众号&#xff0c;侵权删&#xff0c;干货满满。 作者丨派派星 来源丨CVHub 原文链接&#xff1a;现代目标检测故事 | 40种网络架构大盘点&#xff01;从基础架构ResNet到最强检测器Yolov7再到最新部署神器GhostNetV2 导读 目标检测是指在图像或视频中分…

PHY6230 高性价比低功耗高性能 集成32-bit MCU BLE5.2+2.4G芯片

PHY6230 是一款高性价比低功耗高性能Bluetooth LE 5.2系统级芯片&#xff0c;集成32-bit高性能低功耗MCU&#xff0c;16KB OTP&#xff0c;8KB Retention SRAM和64KB ROM&#xff0c;可选EEPROM。内置高性能多模射频收发机最大发射功率10dBm&#xff0c;BLE 1Mbps速率下接收灵敏…

快手发布2022直播生态报告,运营人速览

1、快手电商推出2023年直播间联合补贴活动1月5日&#xff0c;快手电商推出2023年直播间联合补贴活动。该活动主要目的是助力主播完成更高销售额&#xff0c;报名成功后&#xff0c;平台将对直播间内的一部分活跃用户发放10%-16%折扣率的满减优惠券&#xff0c;成本由平台和主播…

【BUG解决方案】jQuery数组中包含数据,但通过 .length 获得的数组长度始终为0

0. BUG展示 var lels []; for (var i 0; i < maxDevNums 1; i) {lels.push([]); } $.ajax({type : "post",async : true,url : "/sc/comb/history/data",data : {},dataType : "json",success : function (result) {if (result) {for (le…

FFmpeg 集成 x265 编译及解码

x265 是一个免费的软件库和应用程序&#xff0c;用于将视频流编码为 H.265/MPEG-H HEVC 压缩格式&#xff0c;并在 GNU GPL 条款下发布。 FFmpeg 为了支持 H.265 编、解码可以集成 x265 编译&#xff0c;在编译 FFmpeg 之前需要先编译 x265&#xff0c;但并不是所有的版本都能…