linux编程之pipe()函数
管道是一种把两个进程之间的标准输入和标准输出连接起来的机制,从而提供一种让多个进程间通信的方法,当进程创建管道时,每次
都需要提供两个文件描述符来操作管道。其中一个对管道进行写操作,另一个对管道进行读操作。对管道的读写与一般的IO系统函数一
致,使用write()函数写入数据,使用read()读出数据。
#include<unistd.h>
int pipe(int filedes[2]);
返回值:成功,返回0,否则返回-1。参数数组包含pipe使用的两个文件的描述符。fd[0]:读管道,fd[1]:写管道。
必须在fork()中调用pipe(),否则子进程不会继承文件描述符。两个进程不共享祖先进程,就不能使用pipe。但是可以使用命名管道。
当管道进行写入操作的时候,如果写入的数据小于128K则是非原子的,如果大于128K字节,缓冲区的数据将被连续地写入
管道,直到全部数据写完为止,如果没有进程读取数据,则将一直阻塞,如下:
在上例程序中,子进程一次性写入128K数据,当父进程将全部数据读取完毕的时候,子进程的write()函数才结束阻塞并且
返回写入信息。
命名管道FIFO
管道最大的劣势就是没有名字,只能用于有一个共同祖先进程的各个进程之间。FIFO代表先进先出,单它是一个单向数据流,也就是半双工,和
管道不同的是:每个FIFO都有一个路径与之关联,从而允许无亲缘关系的进程访问。
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
这里pathname是路径名,mode是sys/stat.h里面定义的创建文件的权限.
以下示例程序来自:http://blog.chinaunix.net/uid-20498361-id-1940238.html
有亲缘关系进程间的fifo的例子
|
从例子上可以看出使用fifo时需要注意:
*fifo管道是先调用mkfifo创建,然后再用open打开得到fd来使用.
*在打开fifo时要注意,它是半双工的的,一般不能使用O_RDWR打开,而只能用只读或只写打开.
fifo可以用在非亲缘关系的进程间,而它的真正用途是在服务器和客户端之间. 由于它是半双工的所以,如果要进行客户端和服务器双方的通信的话,
每个方向都必须建立两个管道,一个用于读,一个用于写.
下面是一个服务器,对多个客户端的fifo的例子:
server 端的例子:
|
客户端的例子:
|
linux编程之pipe()函数相关推荐
- linux编程之pthread_create函数
linux编程之pthread_create函数UNIX环境创建线程函数, 具体格式: #include<pthread.h> int pthread_create(pthread_t * ...
- linux中ftok的作用,Unix/Linux编程之ftok函数用法
linux 中ftok函数的用法 1.函数作用: 系统建立IPC通讯(如消息队列.共享内存时)必须指定一个ID值.通常情况下,该id值通过ftok函数得到 2.函数原型: #include #incl ...
- linux读取文件修改时间函数,Linux服务器编程之utime()函数修改文件存取时间
Linux服务器编程之utime()函数修改文件存取时间 C语言utime()函数:修改文件的存取时间和更改时间 头文件: #include #include 定义函数: int utime(cons ...
- linux c 多显卡编程,Linux 编程之GPU计算(转)
08月11日(星期六) Linux 编程之GPU计算(转) 关于brookgpu的简要介绍看下面的链接: 本文翻译了斯坦福大学网站上的关于brookgpu语言的一篇文章,原文在: 关于brookgpu ...
- socket编程之 accept函数的理解
在进入我们的正题之前,再来复习一波编写服务器的函数流程吧 服务器端:socket()-->bind( )-->listen()-->accept()-->read()/writ ...
- Linux编程之GCC编译工具实战-夏曹俊-专题视频课程
Linux编程之GCC编译工具实战-6075人已学习 课程介绍 本课程使得学员能够学会在linux中如何编译C/C++程序,使用GCC工具如何编译静态库,动态库,如何配置运行动态库. ...
- linux ioctl网络参数设置,Linux 网络编程之ioctl函数
1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的 ...
- Linux 应用编程之stat 函数
Linux 下可以使用 stat 命令查看文件的属性,其实这个命令内部就是通过调用 stat()函数来获取文件属性的,stat 函数是 Linux 中的系统调用,用于获取文件相关的信息.(可通过&qu ...
- Linux应用编程之dup函数和dup2函数
在 Linux 系统中,open 返回得到的文件描述符 fd 可以进行复制,复制成功之后可以得到一个新文件描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作,复制得到的文件描述符和 ...
最新文章
- python wget_python-如何获取wget下载的文件的文件名
- Para list设置
- 39页作业(还款年限—月还款额表)
- Java面向对象(14)--包装类的使用
- C# 事务提交(非数据库)
- tensorflow代码cpu上可以跑gpu跑报错Blas GEMM launch failed
- 如何解决Mac上安装Axure首次打开报错的问题?
- Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}
- 2016网吧服务器系统,原版系统一键优化精简方案(Win10/Server2016/Server2019)
- 怎样在苹果Mac鼠标或触控板上复制和粘贴?
- 基于Hive的淘宝用户行为数据分析
- 如何用ABBYY FineReader提取图片中的文字
- 匹配 网络 Q值 带宽
- 伦巴时间步的动作要领_伦巴前进步动作的基本要领
- QPBOC快速借贷记流程(2)
- IDEA提示方法参数的快捷键
- IT“茫一代”:35岁成生死线 无处安放未来
- 达梦数据库安装学习总结--DCA上篇
- 希望技术帮助一些人更体面的工作和生活
- SQL server数据库恢复挂起的解决办法
热门文章
- 如何获取FragmentTabHost中指定标签页的Fragment
- PLSQL_性能优化系列20_Oracle Result Cash结果缓存
- 2020ICPC(小米邀请赛2) - Data Structure Problem(线段树+树状数组)
- HDU - 5875 Function(单调栈)
- javascript核心_javascript核心之DOM操作
- keil 查看 stm32 io波形_如何系统地入门学习stm32?
- 编程之美之控制cpu线
- python高级语法-高阶函数之map的使用方法
- python基础语法-三大内建数据结构之集合(set)
- POJ1265(Pick定理的应用)