UNPv2第四章:管道和FIFO

1.一个简单的客户服务器例子

2.管道

所有式样的Unix都提供管道。它由pipe函数创建,提供单向数据流

#include<unistd.h>
int pipe(int filedes[2]);

pipe()会建立管道,并将文件描述词由参数filedes数组返回 filedes[0]为管道里的读取端 filedes[1]则为管道的写入端 若成功则返回零,否则返回-1,错误原因存于errno中

例子: Main函数创建两个管道并fork一个子进程,客户然后作为父进程运行,服务器作为子进程运行。第一个管道用于从客户端向服务器发送路径名,第二个管道用于从服务器向客户端发送该文件的内容

3.popen和pclose

#include <stdio.h>
FILE * popen ( const char * command , const char * type );
    //返回:成功时为文件指针,出错时为NULL
int pclose ( FILE * stream );
    //返回:成功时为shell的终止状态,出错时为-1

type 参数只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。 command 参数是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用-c 标志,shell 将执行这个命令。

4.FIFO

FIFO由mkfifo函数创建

#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char * pathname,mode_t mode);
    //返回:成功为0,出错为-1

其中pathname是一个普通的Unix路径名。Mode参数指定文件权限位 Mkfifo函数已隐含指定O_CREAT|O_EXCL。也就是说,它要么创建一个新的FIFO,要么返回一个EEXIST错误 管道和FIFO的区别如下:

  1. 创建并打开一个管道只需要pipe,创建并打开一个FIFO则需要调用mkfifo再调用open
  2. 管道在将它打开着的进程中最后一个关闭它之后自动消失,FIFO的名字只有通过调用unlink才从文件系统中删除

FIFO需要额外调用的好处是:FIFO在文件系统中有一个名字,该名字允许某个进程创建一个FIFO,与它无亲缘关系的另一个进程却打开这个FIFO。对于管道而言是不可能的

5.管道和FIFO的额外属性

下面是管道或者FIFO的读出与写入的若干额外规则:

(1)如果请求读出的数据量多余管道或者FIFO的可用数据量,那么只返回可用数据量
(2)如果请求的数据字节小于等于PIPE_BUF,那么write操作是原子的。
(3)O_NONBLOCK标志的设置对于write操作的原子性没有影响——原子性完全由所请求的字节数是否小于等于PIPE_BUF决定的。然而当一个管道或FIFO设置成非阻塞时,来自wirte的返回值取决于待写的字节数以及管道或FIFO当前可用空间的大小。
    如果待写字节数小于等于PIPE_BUF:
       (i)如果空间足够则写入
       (ii)如果空间不足,那么立即返回EAGAIN
    如果待写字节数大于PIPE_BUF:
       (i)如果还有1字节空间,那么内核写入该管道或FIFO能容纳数目的数据字节,该数目同时作为来自write的返回值
       (ii)如果空间已满,那么立即返回EAGAIN
    如果写入一个没有打开着用于读的管道或者FIFO,那么内核产生SIGPIPE信号

6.字节流和消息

有时候应用希望对所传送的数据加上某种结构。当数据由变长消息构成,并且读出者必须知道这些消息的边界以判定何时已读出单个消息时,这种需求可能发生。下面三种技巧经常用于这个目的: 带内特殊终止序列:许多Unix应用程序使用换行符来分隔每个消息。写入进程给每个消息添加一个换行符,读出进程每次读出一行。 显示长度:每个记录前冠以它的长度。 每次连接一个记录:应用通过关闭与其对方的连接来指示一个记录的结束

7.管道和FIFO限制

系统加于管道和FIFO的唯一限制为 OPEN_MAX 一个进程在任意时刻打开的最大描述字数(至少16) PIPE_BUF 可原子的写往一个管道或者FIFO的最大数据量(至少512)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏米扑专栏

Win Unix Mac 等多种系统平台的宏定义

最近正在学习C++程序从 Windows 平台向 Unix 平台移植,参考了 qt 的宏定义文件

14420
来自专栏HelloCode开发者学习平台

99%的开发者都不了解的,原来是这样...

操作系统是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。裸机没有安装操作...

11220
来自专栏米扑专栏

Linux vmstat 命令详解

vmstat  命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,MEM内存使用,VMSwap虚拟内存...

21350
来自专栏刘晓杰

UNPv2第一章:简介

IPC是进程间通信(interprocess communication)的简称。传统上该术语描述的是运行在某个操作系统上的不同进程间的消息传递的不同方式。 ...

10730
来自专栏米扑专栏

Windows如何压缩tar.gz格式

tar.gz 是linux和unix下面比较常用的格式,几个命令就可以把文件压缩打包成tar.gz格式

13540
来自专栏java小白

MySQL日期和时间函数

WEEK(DATE):返回所给的日期是一年中的第几周 YEAR(DATE):返回所给的日期是哪一年 HOUR(time):返回所给时间的小时 MIN...

30140
来自专栏CWIKIUS

Confluence 6 导入 SSL 证书和问题解决

https://www.cwiki.us/display/CONF6ZH/Connecting+to+LDAP+or+Jira+applications+or+...

20340
来自专栏米扑专栏

Windows连接Linux的常用工具

Putty是一个免费的、Windows 32平台下的telnet、rlogin和ssh客户端,但是功能丝毫不逊色于商业的telnet类工具。用它来远程管理Lin...

1.2K10
来自专栏米扑专栏

Linux Shell 常用命令与目录分区的学习总结

版权声明:本文为米扑博客原创文章,未经米扑博客允许不得转载。 https://blog.cs...

11130

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励