Linux学习笔记-匿名和命名管道读写的相同点及不同点
发布日期:2021-06-30 10:58:49
浏览次数:2
分类:技术文章
本文共 1264 字,大约阅读时间需要 4 分钟。
目录
理论
匿名和命名管道读写的相同性
1.默认都是阻塞性读写;
2.都适用于socket的网络通信;
3.阻塞不完整管道(有一段关闭)
a.单纯读时,在所有数据被读取后,read返回0,以表示到达了文件尾部。
b..单纯写时,则产生信号SIGPIPE,如果忽略该信号或捕捉该信号并从处理程序返回,则write返回-1,同时errno设置为EPIPE。
4.阻塞完整管道(两端都开启)
a.单纯读时,要么阻塞,要么读取到数据。
b.单纯写时,写到管道满时会出错。
5.非阻塞不完整管道(有一端关闭)
a.单纯读时直接报错;
b.单纯写时,则产生信号SIGPIPE,如果忽略该信号或捕捉该信号并从处理程序返回,则write返回-1,则同时errno设置为EPIPE。
6.非阻塞完整管道(两端都开启)
a.单纯读时直接报错;
b.单纯写时,写到管道时会出错;
不同点
1.打开方式不一致;
2.pipe通过fcntl系统设置O_NOBLOCK来设置非阻塞性读写;
3.FIFO通过fcntl系统调用或者open函数来设置非阻塞;
例子
FIFO通过fcntl系统调用或者open函数来设置非阻塞性读写
如下的源码:
fifo_read.c
#include#include #include int main(int argc, char *argv[]){ if(argc < 2){ printf("usage:%s fifo\n", argv[0]); exit(1); } printf("open fifo read... \n"); //int fd = open(argv[1], O_RDONLY); int fd = open(argv[1], O_RDONLY | O_NONBLOCK); if(fd < 0){ perror("open error"); exit(1); } else{ printf("open file success:%d\n", fd); } //从命名管道中读取数据 char buf[512]; memset(buf, 0, sizeof(buf)); while(read(fd, buf, sizeof(buf)) < 0){ perror("read error"); } printf("%s\n", buf); close(fd); exit(0);}
运行截图如下:
转载地址:https://it1995.blog.csdn.net/article/details/86103432 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月20日 13时53分41秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
RRT算法(快速拓展随机树)的Python实现
2019-04-30
D*算法
2019-04-30
强化学习(四) —— Actor-Critic演员评论家 & code
2019-04-30
RESTful API
2019-04-30
优化算法(四)——粒子群优化算法(PSO)
2019-04-30
数据在Oracle中的存储
2019-04-30
轨迹规划 trajectory planning
2019-04-30
AGV自动导引运输车
2019-04-30
Trie树(字典树)
2019-04-30
COMP7404 Machine Learing——KNN
2019-04-30
COMP7404 Machine Learing——SVM
2019-04-30