zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    mysq 日期相减
    说说时间观与时间管理——北漂18年(71)
    ionic之切换开关
    ionic之单选框
    SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录
    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
    14.5.2.2 autocommit, Commit, and Rollback
    14.5.2 事务隔离级别
    对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
    mysql explain 解释
  • 原文地址:https://www.cnblogs.com/hadex/p/6128446.html
Copyright © 2011-2022 走看看