有名管道通讯编程
2016-06-04 08:10
162 查看
创建2个进程,在A进程中创建一个有名管道,并向其写入数据,通过B进程从有名管道中读出数据。
有名管道又称命名管道,可用于无亲缘关系的进程之间通信,在某些特点上类似于文件。
用法:通过mkfifo创建有名管道,之后就可以想操作普通文件通过open()、close()、write()、以及read()对它进行相应操作。
1、创建一个有名管道--mkfifo
头文件:#include<sys/types.h>,#include<sys/stat.h>
原型:int mkfifo(const char *pathname,mode_t mode);
参数说明:pathname:创建有名管道对应的实名文件路径,mkfifo()会依参数建立特殊的FIFO文件,该文件必须不存在,mode:文件的权限。
返回值:成功返回0,失败返回-1,错误原因存于errno中。
2、删除有名管道(实质是一个文件)---unlink
头文件:#include<unistd.h>
原型:int unlink(const char *pathname);
参数说明:pathname:有名管道文件路径名
返回值:成功返回0,失败返回-1,错误原因存于errno中。
fifo_write.c
fifo_read.c
total.h
先执行读
后执行写
在这里为什么先执行读,再执行写才能把写入的数据读出来??当先写入数据时,再执行读 是没法读出数据的?为什么?
注意:
errno是记录系统的最后一次错误代码,代码是一个int型的值,在errno.h中定义。
对于参数O_NONBLOCK是非阻塞模式,以open操作为例,就是open以及接下来在这个文件描述符上的操作,都不会让调用进程等待数据到来,而是直接返回EAGAIN。比如你操作一个video camera设备,使用非阻塞模式打开/dev/video,读取数据时,v412 buffer队列有可用数据返回数据,没有可用数据,则立即返回EAGAIN。使用阻塞模式打开/dev/video,当没有数据可用时,则当前进程休眠在这个buffer queue等待队列上,直到新数据到达,唤醒等待队列上的进程才会返回。
总结:有名管道创建成功后,一个进程以只读方式打开,另一进程以只写方式打开。
有名管道又称命名管道,可用于无亲缘关系的进程之间通信,在某些特点上类似于文件。
用法:通过mkfifo创建有名管道,之后就可以想操作普通文件通过open()、close()、write()、以及read()对它进行相应操作。
1、创建一个有名管道--mkfifo
头文件:#include<sys/types.h>,#include<sys/stat.h>
原型:int mkfifo(const char *pathname,mode_t mode);
参数说明:pathname:创建有名管道对应的实名文件路径,mkfifo()会依参数建立特殊的FIFO文件,该文件必须不存在,mode:文件的权限。
返回值:成功返回0,失败返回-1,错误原因存于errno中。
2、删除有名管道(实质是一个文件)---unlink
头文件:#include<unistd.h>
原型:int unlink(const char *pathname);
参数说明:pathname:有名管道文件路径名
返回值:成功返回0,失败返回-1,错误原因存于errno中。
fifo_write.c
fifo_read.c
total.h
先执行读
后执行写
在这里为什么先执行读,再执行写才能把写入的数据读出来??当先写入数据时,再执行读 是没法读出数据的?为什么?
注意:
errno是记录系统的最后一次错误代码,代码是一个int型的值,在errno.h中定义。
对于参数O_NONBLOCK是非阻塞模式,以open操作为例,就是open以及接下来在这个文件描述符上的操作,都不会让调用进程等待数据到来,而是直接返回EAGAIN。比如你操作一个video camera设备,使用非阻塞模式打开/dev/video,读取数据时,v412 buffer队列有可用数据返回数据,没有可用数据,则立即返回EAGAIN。使用阻塞模式打开/dev/video,当没有数据可用时,则当前进程休眠在这个buffer queue等待队列上,直到新数据到达,唤醒等待队列上的进程才会返回。
总结:有名管道创建成功后,一个进程以只读方式打开,另一进程以只写方式打开。
相关文章推荐
- Java笔记之方法
- 【java并发】线程锁技术的使用
- 属性动画使用详解2(Evaluator与Interpolator)
- 用java.util.Observable实现Observer模式
- python 内置函数
- 用python自动发微博
- 基于Spring的多数据源(Druid)定时任务项目开发(一)<带Demo>
- Java 命令行编译项目
- Spring Annotaion Support
- 关于C语言字符串和指针的总结
- windows 8.1 64位PC,Visual Studio 2013 Ultimate,C# .NET 4.0,环境下编写windows服务,亲测成功!
- C++第六次作业
- 利用KeyValuePair生成sql键值对csharpVS2015
- c++上机作业7 项目二 最大公约数 最小公倍数问题 特殊三位数问题 素数数组问题
- 自定义控件知识储备-LayoutParams的那些事
- Qt 解析Json
- 【LeetCode】23. Merge k Sorted Lists 基于Java的解法
- Python_Day_4(内置函数之篇)
- 用eclipse写java程序时,出现XXX cannot be resolved to a type
- python set operation