linux应用编程学习(5)管道
来源:互联网 发布:软件外包开发 编辑:程序博客网 时间:2024/05/16 11:47
第5类 管道通讯编程类
一、通讯目的
1、数据传输
1)管道通信是单向的,有固定的读端和写端
2)数据被进程从管道读出后,在管道中该(取)数据就不存在了。
3)当进程去读取空管道的时候,进程会阻塞。(进程等待:读时空就等到写入、管道满了空出来才能写)
4)管道容量为64KB(#define PIPE_BUFFERS 16 include/linux/pipe_fs_i.h)
5.1 创建无名管道
5.1.1 函数名
pipe
5.1.2 函数原形
int pipe(int pipefd[2]);
5.1.3 函数功能
创建无名管道
5.1.4 所属头文件
unistd.h
5.1.5 返回值
成功:0 失败:-1
5.1.6 参数说明
5.2 创建有名管道
5.2.1 函数名
mkfifo
5.2.2 函数原形
int mkfifo(const char* pathname, mode_t mode);
5.2.3 函数功能
创建有名管道
5.2.4 所属头文件
sys/types.h sys/stat.h
5.2.5 返回值
success:0 error:-1
5.2.6 参数说明
pathname:要创建的fifo文件名
mode:fifo文件创建的标志权限
5.3 删除有名管道
5.3.1 函数名
unlink
5.3.2 函数原形
int unlink(const char *pathname);
5.3.3 函数功能
删除文件
5.3.4 所属头文件
stdio.h
5.3.5 返回值
success:0
error:-1
5.3.6 参数说明
pathname:用来指明要删除的文件名字(含路径)
fifo-write.cfifo-read.c
fifo在写入后如果没有被读取,进程会被阻塞直到被读取后结束。
http://blog.csdn.net/nodeathphoenix/article/details/23357453
一、对于FIFO,需要open去打开FIFO的读端或是写端的描述符。
一、通讯目的
1、数据传输
一个进程需要将数据发送给另一个进程。
2、资源共享
多个进程之间共享同样的资源。
3、通知事件
一个进程需要向另一个/组进程发送消息,通知它们发生了某事件。
4、进程控制
有些进程希望完全控制另一个进程的执行(如Debug进程),此时
控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它
的状态改变。
二、通讯的发展
linux进程通信(IPC:interprocess comnunication),由UNIX进程间通信、基于System V进程间通信、POSIX进程间通信几部分发展而来的。
POSIX:(Portable Operating System Interface)表示可移植操作系统接口,用来提高可移植性。
三、Linux进程通信方式
1、无名管道(pipe):数据传输
四、无名管带只能用于父进程和子进程通信,有名管道可用于运行同一系统中的任意两个进程间的通信。二、通讯的发展
linux进程通信(IPC:interprocess comnunication),由UNIX进程间通信、基于System V进程间通信、POSIX进程间通信几部分发展而来的。
POSIX:(Portable Operating System Interface)表示可移植操作系统接口,用来提高可移植性。
三、Linux进程通信方式
1、无名管道(pipe):数据传输
2、有名管道(FIFO):数据传输
3、信号(signal):事件通知
4、消息队列
5、共享内存
6、信号量:资源共享
7、套接字(socket)
1)管道通信是单向的,有固定的读端和写端
2)数据被进程从管道读出后,在管道中该(取)数据就不存在了。
3)当进程去读取空管道的时候,进程会阻塞。(进程等待:读时空就等到写入、管道满了空出来才能写)
4)管道容量为64KB(#define PIPE_BUFFERS 16 include/linux/pipe_fs_i.h)
5.1 创建无名管道
5.1.1 函数名
pipe
5.1.2 函数原形
int pipe(int pipefd[2]);
5.1.3 函数功能
创建无名管道
5.1.4 所属头文件
unistd.h
5.1.5 返回值
成功:0 失败:-1
5.1.6 参数说明
Pipefd[2]:pipefd[0]指向读端末尾
Pipefd[1]指向写端末尾
创建无名管道,并用于父子进程通讯
创建无名管道,并用于父子进程通讯
- #include <unistd.h>
- #include <stdio.h>
- void main()
- {
- int pipefd[2];
- int ret;
- pid_t pid;
- char buf[20];
-
- /*创建管道*/
- ret = pipe(pipefd);
- if(ret == -1)
- {
- printf("creat pipe failed.\n");
- return;
- }
-
- pid = fork();
- if(pid > 0)
- {
- /*父进程写入数据*/
- write(pipefd[1], "Hello", 6);
- wait();
- close(pipefd[1]);
- exit(0);
- }
- else if(pid == 0)
- {
- /*子进程读取数据*/
- if(read(pipefd[0], buf, 6) > 0)
- printf("read buf is %s.\n",buf);
- exit(0);
- }
- else
- {
- printf("creat process failed.\n");
- return;
- }
- }
5.2 创建有名管道
5.2.1 函数名
mkfifo
5.2.2 函数原形
int mkfifo(const char* pathname, mode_t mode);
5.2.3 函数功能
创建有名管道
5.2.4 所属头文件
sys/types.h sys/stat.h
5.2.5 返回值
success:0 error:-1
5.2.6 参数说明
pathname:要创建的fifo文件名
mode:fifo文件创建的标志权限
5.3 删除有名管道
5.3.1 函数名
unlink
5.3.2 函数原形
int unlink(const char *pathname);
5.3.3 函数功能
删除文件
5.3.4 所属头文件
stdio.h
5.3.5 返回值
success:0
error:-1
5.3.6 参数说明
pathname:用来指明要删除的文件名字(含路径)
fifo-write.c
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <unistd.h>
- int main()
- {
- int fd;
- mkfifo("/tmp/myfifo",0666);
- fd = open("/tmp/myfifo",O_WRONLY);
- write(fd,"Hello World",12);
- close(fd);
- return 0;
- }
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <stdio.h>
- int main()
- {
- int fd;
- char buf[20];
- fd = open("/tmp/myfifo",O_RDONLY);
- read(fd,buf,15);
- printf("read myfifo is %s.\n",buf);
- close(fd);
- unlink("/tmp/myfifo");
- return 0;
- }
fifo在写入后如果没有被读取,进程会被阻塞直到被读取后结束。
http://blog.csdn.net/nodeathphoenix/article/details/23357453
一、对于FIFO,需要open去打开FIFO的读端或是写端的描述符。
1> 如果open的时候没有指定O_NONBLOCK标志,且open的是读端时
如果不存在此FIFO的已经打开的写端时,open会一直阻塞到有FIFO的写端打开;
如果已经存在此FIFO的打开的写端时,open会直接成功返回。
2> 如果open的时候没有指定O_NONBLOCK标志,且open的是写端时
如果不存在此FIFO的已经打开的读端时,open会一直阻塞到有FIFO的读端打开;
如果已经存在此FIFO的打开的读端时,open会直接成功返回。
二、从FIFO或者空管道读写
1> read时,读端fd没有指定O_NONBLOCK标志
如果存在此FIFO或管道的已经打开的写端时,阻塞到FIFO或管道中有数据或者FIFO或管道的已经打开的写端全部被关闭为止。
如果不存在此FIFO或管道的已经打开的写端时,read返回0;
2> write时, 同read差不多,就不详述了。
0
上一篇:android编译环境配置总结
下一篇:linux实用技巧:你该使用ctags查找源码了
相关热门文章
- 欢迎天涯学习在ChinaUnix博客...
- Win10+Qt5.6+OpenCV3.1__相关...
- Qt学习笔记---信号与槽...
- APP开发流程,你知道多少...
- 《深入Linux设备驱动程序机制...
- linux 常见服务端口
- xmanager 2.0 for linux配置
- 【ROOTFS搭建】busybox的httpd...
- openwrt中luci学习笔记
- 什么是shell
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- linux应用编程学习(5)管道
- LInux系统编程学习之《管道的应用》
- linux应用编程--命名管道
- linux应用开发-无名管道编程
- linux应用开发-有名管道编程
- linux应用编程--pipe无名管道
- linux应用编程笔记(9)无名管道编程
- linux应用编程笔记(10)有名管道编程
- linux编程--管道编程
- 6.Linux应用编程——管道、信号
- Linux无名管道编程
- Linux有名管道编程
- linux管道编程
- Linux管道编程实例
- Linux管道编程实例
- Linux管道编程实例
- Linux管道编程
- Linux--编程--管道
- 控制寄存器(CR0,CR1,CR2,CR3)和CR4
- 2017超星慕课尔雅古希腊的思想世界答案题库
- AT&T资料(留着以后能看)
- linux内核 asmlinkage宏
- android编译环境配置总结
- linux应用编程学习(5)管道
- linux实用技巧:你该使用ctags查找源码了
- 内核模块下载和编译、安装
- 3.18内核的sk_buff
- 不可睡眠锁:自旋锁spinlock编码学习
- 8.可变对象(无序表和有序表——含java库中应用)
- LoRa笔记02 LoRa sx1276 sx1278的发射功率研究
- 不可睡眠锁:RCU read-copy-updat
- 可睡眠锁 互斥量、信号量、读写信号量、完成变量
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
乾隆通宝一枚多少钱
康熙雍正乾隆
乾隆为什么不拜雍正
乾隆用力挺金锁
戏说乾隆主题曲
乾隆花瓶1磅卖出
乾隆下江南时每次都住哪
戏说乾隆第一部全集40国语版
戏说乾隆全集
乾隆皇帝简介
康熙雍正乾隆顺序
乾隆为什么要骂雍正
乾隆通宝值多少钱
乾隆后宫令妃传
乾隆为什么让十五子继承皇位
乾隆为什么不杀和珅
乾隆通宝值钱
戏说乾隆第一部免费观看
乾隆铜钱图片及价格表
戏说乾隆第一部全集
乾隆皇与三姑娘
康熙乾隆雍正顺序
清乾隆各种釉彩大瓶
康熙乾隆雍正
乾隆怎么死的
乾隆珐琅彩葫芦瓶
乾隆年制瓷碗价格
乾隆皇帝 二月河
乾隆粉彩花瓶价格
清乾隆青花瓷价格
二月河 乾隆皇帝
乾隆年间的青花瓷
乾隆珐琅彩瓷器特征
乾隆孝粉玉碗市场价
乾隆百子祝寿瓶价格
乾隆年制瓷器价格
乾隆青花瓷盘价格
乾隆孝粉真品图片
乾隆粉彩拍卖价格
乾隆孝粉碗真品图
乾隆黄釉瓷器鉴定