目录

理论

栗子


理论

管道的读写特性

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学习笔记-管道的读写特性相关推荐

  1. Linux学习笔记2-文件读写操作

    1.查看执行过的命令(历史文件) 执行过的命令,可以在终端按上下方向键来选择. 用History命令会列出历史命令(只保存最近使用的一千条命令,保存在家目录.bash_history文件)前面是标号, ...

  2. Linux学习笔记-无名管道,有名管道,消息队列

    Linux学习笔记-无名管道,命名管道,消息队列 无名管道 特点 创建无名管道的函数 demo 命名管道 特点 创建命名管道的函数 demo 消息队列 特点 创建消息队列涉及到的函数 demo 无名管 ...

  3. Linux学习笔记(包含虚拟机及Linux系统安装)

    Linux学习笔记 1.1 Linux简介 1.2 Linux 的版本 1.3 Linux的应用 2.Linux的安装 2.1 虚拟机安装 2.1.1 什么是虚拟机? 2.1.2 VMware介绍 2 ...

  4. Linux学习笔记-随即更新-慢速学习

    Linux学习笔记 Linux系统简介 UNIX发展历史和发行版本 开源软件简介 支撑互联网的开源技术 Linux应用领域 Linux学习方法 Linux系统安装 给初学者的建议 学习linux的注意 ...

  5. 迅为嵌入式Linux学习笔记5——进程间通信

    迅为嵌入式Linux学习笔记5--进程间通信 管道通信 无名管道 无名管道只能实现有亲缘关系的进程之间的通信,比如父子进程. pipe函数: #include <unistd.h> int ...

  6. 大数据开发工程师基本功修炼之史上最全Linux学习笔记(建议)

    我正在参加年度博客之星评选,请大家帮我投票打分,您的每一分都是对我的支持与鼓励. 2021年「博客之星」参赛博主:Maynor大数据 (感谢礼品.红包免费送!) https://bbs.csdn.ne ...

  7. Linux学习笔记1--Linux文件系统之CentOS7挂载U盘

    Linux学习笔记(一) CentOS7挂载U盘 插入U盘连接虚拟机 打开终端 创建U盘目录 挂载U盘 卸载U盘 可能出现的bug Linux文件系统与Windows文件系统之比 二者文件系统具体 二 ...

  8. Linux 学习笔记之超详细基础linux命令 Part 3

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...

  9. Linux学习笔记-文件权限与路径

    Linux学习笔记-文件与目录 目前从电子信息科学与技术转到了计算机专业,因此想趁着大四比较闲的时候补一些计算机的知识.我想说:你好,生活[斜眼笑]!愿生活温柔以待!哈哈,这是我写的第一篇博客,谨以此 ...

最新文章

  1. android 小知识点
  2. 普通程序员如何转向AI方向(转)
  3. 01-java基础加强,eclipse工具使用,快捷键,断点调试,单元测试,jdk5新特性,增强for循环,集合map,list,可变参数,枚举,反射,泛型
  4. Java笔记-AES加解密(PKCS7padding可用)
  5. 你活了多久----快用Python计算一下日期
  6. linux进程跑飞了,【Shell】Linux信号(二)
  7. linux中流设备_[快速上手Linux设备驱动]之块设备驱动流程详解一
  8. Linux 离线安装软件
  9. linux fileinfo.so,Centos 下编译安装fileinfo扩展
  10. tomcat乱码问题解决
  11. mysql常用语句梳理
  12. 金仓数据库 KingbaseES SQL 语言参考手册 (10. 查询和子查询)
  13. 制作仅在xy方向有周期性的夹层结构,且不使用约束平板
  14. 会计学基础期末考试试题及答案
  15. ESP32 NVS同windows文件系统的类比,附上一段NVS操作的代码解析
  16. 使用浏览器抓包获取API
  17. PaddleOCR——训练总结
  18. linux下迅雷远程下载服务,在 Linux 下使用迅雷的另一种无入侵方式
  19. 盘点激光雷达常用的10大数据处理软件
  20. 机器学习笔记--PR曲线和ROC曲线

热门文章

  1. 利用SQL*Loader将 Excel 数据导出到 Oracle 数据库中
  2. 阿里巴巴投资以色列风投JVP 规模数千万美元
  3. 我是一个来自泰兴的程序员,我喜欢C++
  4. 根本无处可避的广东三游
  5. 如何“干净地”终止 Win32 中的应用程序
  6. 如何改变对话或窗体视窗的背景颜色
  7. 我真的是前端公众号 NO.1 ?
  8. 今天会议的召开,和你有关系吗?
  9. 虚拟邮箱怎么设置方法_腾讯企业邮箱邮件列表白名单设置方法
  10. oracle in 索引_Oracle 性能优化总结