Linux学习笔记-管道的读写特性
目录
理论
栗子
理论
管道的读写特性
1.通过打开两个管道来创建一个双向的管道;
2.管道默认是阻塞性的,当进程从管道中读取数据,若没有数据进程会阻塞;
3.当一个进程往管道中不断地写入数据但是没有进程去读取数据,此时只要管道没有满是可以写的,但若管道放满数据的则会报错;
下面举两个例子!
不完整管道:
1.当读一个写端已被关闭的管道时,在所有数据被读取后,read返回0,易表示到达了文件尾部;
2.如果写一个读端已被关闭的管道,则产生信号SIGPIPE,如果忽略该信号或捕捉该信号并从处理程序的返回,而write返回-1,同时erno设置为EPIPE;
栗子
例子一:当读一个写端已被关闭的管道时,在所有数据被读取后,read返回0,易表示到达了文件尾部;
程序运行截图如下:
源码如下:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>/** 不完整管道:* 读取一个写端已经关闭的管道*/int main(void){int fd[2];if(pipe(fd) < 0){perror("pipe error");exit(1);}pid_t pid;if((pid = fork()) < 0){perror("fork error");exit(1);}else if(pid > 0){ //parent process//父进程不完整(写端关闭)中读取数据sleep(5);close(fd[1]);while(1){char c;if(read(fd[0], &c, 1) == 0){printf("\n write-end of pipe closed\n");break;}else{printf("%c", c);}}close(fd[0]);wait(0);}else{ //child process//子进程负责将数据写入管道close(fd[0]);char *s = "12345";write(fd[1], s, sizeof(s));//写入数据后关闭管道的写端close(fd[1]);}exit(0);
}
例子二:如果写一个读端已被关闭的管道,则产生信号SIGPIPE,如果忽略该信号或捕捉该信号并从处理程序的返回,而write返回-1,同时erno设置为EPIPE;
程序运行截图如下:
源码如下:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <errno.h>/** 不完整管道:写一个读端已经被关闭的管道*/void sig_handler(int signo){if(signo == SIGPIPE){printf("SIGPIPE occured\n");}
}int main(void){int fd[2];if(pipe(fd) < 0){perror("pipe error");exit(1);} pid_t pid;if((pid == fork()) < 0){perror("fork error");exit(1);}else if(pid > 0){ //parent process//父进程负责将数据写到不完整的管道(读端关闭)中sleep(5);close(fd[0]);if(signal(SIGPIPE, sig_handler) == SIG_ERR){perror("signal sigpipe error");exit(1);}char *s = "1234";if(write(fd[1], s, sizeof(s)) != sizeof(s)){fprintf(stderr, "%s, %s\n", strerror(errno), (errno == EPIPE) ? "EPIPE" : ",unknow");}close(fd[1]);wait(0);}else{ //child processclose(fd[0]); //子进程关闭管道读端close(fd[1]); }exit(0);
}
Linux学习笔记-管道的读写特性相关推荐
- Linux学习笔记2-文件读写操作
1.查看执行过的命令(历史文件) 执行过的命令,可以在终端按上下方向键来选择. 用History命令会列出历史命令(只保存最近使用的一千条命令,保存在家目录.bash_history文件)前面是标号, ...
- Linux学习笔记-无名管道,有名管道,消息队列
Linux学习笔记-无名管道,命名管道,消息队列 无名管道 特点 创建无名管道的函数 demo 命名管道 特点 创建命名管道的函数 demo 消息队列 特点 创建消息队列涉及到的函数 demo 无名管 ...
- Linux学习笔记(包含虚拟机及Linux系统安装)
Linux学习笔记 1.1 Linux简介 1.2 Linux 的版本 1.3 Linux的应用 2.Linux的安装 2.1 虚拟机安装 2.1.1 什么是虚拟机? 2.1.2 VMware介绍 2 ...
- Linux学习笔记-随即更新-慢速学习
Linux学习笔记 Linux系统简介 UNIX发展历史和发行版本 开源软件简介 支撑互联网的开源技术 Linux应用领域 Linux学习方法 Linux系统安装 给初学者的建议 学习linux的注意 ...
- 迅为嵌入式Linux学习笔记5——进程间通信
迅为嵌入式Linux学习笔记5--进程间通信 管道通信 无名管道 无名管道只能实现有亲缘关系的进程之间的通信,比如父子进程. pipe函数: #include <unistd.h> int ...
- 大数据开发工程师基本功修炼之史上最全Linux学习笔记(建议)
我正在参加年度博客之星评选,请大家帮我投票打分,您的每一分都是对我的支持与鼓励. 2021年「博客之星」参赛博主:Maynor大数据 (感谢礼品.红包免费送!) https://bbs.csdn.ne ...
- Linux学习笔记1--Linux文件系统之CentOS7挂载U盘
Linux学习笔记(一) CentOS7挂载U盘 插入U盘连接虚拟机 打开终端 创建U盘目录 挂载U盘 卸载U盘 可能出现的bug Linux文件系统与Windows文件系统之比 二者文件系统具体 二 ...
- Linux 学习笔记之超详细基础linux命令 Part 3
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...
- Linux学习笔记-文件权限与路径
Linux学习笔记-文件与目录 目前从电子信息科学与技术转到了计算机专业,因此想趁着大四比较闲的时候补一些计算机的知识.我想说:你好,生活[斜眼笑]!愿生活温柔以待!哈哈,这是我写的第一篇博客,谨以此 ...
最新文章
- android 小知识点
- 普通程序员如何转向AI方向(转)
- 01-java基础加强,eclipse工具使用,快捷键,断点调试,单元测试,jdk5新特性,增强for循环,集合map,list,可变参数,枚举,反射,泛型
- Java笔记-AES加解密(PKCS7padding可用)
- 你活了多久----快用Python计算一下日期
- linux进程跑飞了,【Shell】Linux信号(二)
- linux中流设备_[快速上手Linux设备驱动]之块设备驱动流程详解一
- Linux 离线安装软件
- linux fileinfo.so,Centos 下编译安装fileinfo扩展
- tomcat乱码问题解决
- mysql常用语句梳理
- 金仓数据库 KingbaseES SQL 语言参考手册 (10. 查询和子查询)
- 制作仅在xy方向有周期性的夹层结构,且不使用约束平板
- 会计学基础期末考试试题及答案
- ESP32 NVS同windows文件系统的类比,附上一段NVS操作的代码解析
- 使用浏览器抓包获取API
- PaddleOCR——训练总结
- linux下迅雷远程下载服务,在 Linux 下使用迅雷的另一种无入侵方式
- 盘点激光雷达常用的10大数据处理软件
- 机器学习笔记--PR曲线和ROC曲线