[15]APUE:pipe / FIFO

管道 pipe

一、概述

  • 管道(pipe / FIFO)是一种文件,属于 pipefs 文件系统类型,可以使用 read、write、close 等系统调用进行操作
  • 其本质是内核维护了一块缓冲区与管道相关联,对管道的任何操作,都将被内核转换成读写对应的内存缓冲区
  • 只有当所有的写入端描述符均已关闭,且管道中的数据都被读出后,对读端描述符调用 read 才会返回 0 (EOF)
  • 若所有读端已关闭,此时往管道的写操作会失败,调用进程会收到 SIGPIPE 信号,errno 被设置为 EPIPE
  • 当所有的读端与写端均关闭后,管理才能被销毁
  • 通常只保留一对一的读写端口,无用的端口需及时关闭

二、函数

[a] pipe

#include <unistd.h>
int pipe(int pipefd[2]) //成功返回 0,出错返回 -1 
  • 将整型数组 pipefd 的两个元素初始化为一对文件描述符,分别用于从管道中读数据(pipefd[0])、写数据(pipefd[1])
  • 由于 fork 之后子进程继承父进程的文件描述符,pipe 通常用于父子进程通信
  • 同一会话中的进程可通过复制(dup2)文件描述符的方式实现管道通信,如 shell 的 ‘|’ 功能

[b] popen / pclose

#include <stdio.h>
FILE *popen(const char *cmd, const char *type) //成功返回 FILE 流指针,出错返回 NULL
int pclose(FILE *stream) //成功返回 0,出错返回 -1 
  • popen 用于通过 shell 执行外部程序 cmd
    • 当 type 设置为 “r” 时,通过 fgets、fgetc 等函数可获取 cmd 执行结果(标准输出)
    • 当 type 为 “w” 时,写通过 fputs 等函数为 cmd 标准输入
  • 与 system 函数原理类似,但 system 在返回之前,调用程序将一直阻塞;而 popen 不同,在调用 popen 之后到 pclose 返回之前这段时间,调用进程与被执行的 shell 子进程是并行的,若在此期间,调用程序又 fork 了子进程且安装了 SIGCHLD 信号的处理函数,可能导致 shell 子进程返回的 SIGCHLD 信号被捕获,从而使 pclose 无法等待 cmd 进程的退出而失败

命名管道 FIFO

一、概要

  • FIFO 是在 fifo 核心代码之上构建的外壳,通过文件系统中的文件直接引用,可用于同一操作系统内任意两个进程的通信
  • FIFO 通过设置不同的 open 权限标志位区分输入输出端,读端通常设置 O_RDONLY,写端通常设置 O_WRONLY
  • 管道传输的内容通常为非结构化的字节流,当多个客户端同时连接服务端 FIFO 时,为准确区分不同客体的内容,通常客户端发送的字节流前 N 个字节固定用于指定当次传输的数据长度

二、函数

[a] mkfifo

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *path, mode_t mode) //成功返回 0,出错返回 -1 
  • fcntl 函数设置的 O_NONBLOCK 标志位会对 FIFO 的行为产行影响
    • 当写端未就緒时,读操作将也会立即以成功状态返回,errno 设置为 EAGAIN
    • 当读端未就緒时,写操作将立即以出错状态返回,并设置 errno 为 ENXIO
  • 识别 FIFO 文件类型:用 stat 或 fstat 函数将文件属性写入 buf 结构体,S_ISFIFO(buf->st_mode) 的返回真(1)即为 FIFO

转载于:https://www.cnblogs.com/hadex/p/6128446.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值