zoukankan      html  css  js  c++  java
  • 管道和FIFO

    1. 管道(无名管道)

    pipe函数

    管道由pipe函数创建,提供一个单向半双工数据流,它没有名字,只能在父子进程间使用。

    #include <unistd.h>
    
    //成功返回0,失败返回-1
    int pipe(int fd[2]);
    

    pipe通过参数fd[2]返回两个文件描述符:fd[0]用于读,fd[1]用于写,管道的典型的用法如下:

    • 父进程创建一个管道,然后调用fork创建子进程
    • 父进程关闭fd[0],即父进程只负责写
    • 子进程关闭fd[1],即子进程只负责读

    这样,就实现了一个从父进程——>子进程的单向数据通道,如下图所示。

    当然,上述用法还可以再进一步,父进程fork前再创建一个管道,按相同的方法实现一个从子进程——>父进程的单向数据通道。
    两个管道结合,就实现了父子进程之间的双向数据通道,如下图所示。

    popen函数

    作为一个关于管道的例子,标准IO库提供了popen函数,它创建一个管道并启动另外一个进程,该进程要么通过该管道从标准输入读,要么通过该管道向标准输出写。

    #include <stdio.h>
    
    //成功返回文件指针,失败返回NULL
    FILE *popen(const char *command, const char *type);
    
    //成功返回shell终止状态,失败返回-1
    int pclose(FILE *fp);
    

    其中command必须是一个shell命令行,由popen返回的FILE指针fp,要么用于输入,要么用于输出,取决于type的值:

    • 如果type为"r",那么调用进程通过fp可以获取popen的输出
    • 如果type为"w",那么调用进程通过fp可以向popen写,写入的内容作为popen的输入

    pclose关闭由popen创建的标准IO流。

    2.FIFO(有名管道)

    FIFO也是一个单向半双工数据流,但每个FIFO都有一个路径名与之关联,因此可以用于无亲缘关系的进程之间,FIFO也称为有名管道。

    • mkfifo用于创建一个FIFO,该函数内部隐含指定 O_CREAT | O_EXCL
    • 打开一个已存在的FIFO,应该使用open,且只能以只读或只写方式打开
    #include <sys/types.h>
    #include <sys/stat.h>
    
    //成功返回0,失败返回-1
    int mkfifo(const char *pathname, mode_t mode);
    

    pathname是用于标识FIFO的路径名,mode含义与可设的值同Posix IPC创建函数,即6个S_IRXXX常值,具体细节在Posix信号量一文中有讲过。

  • 相关阅读:
    bridge桥接模式
    docker部署mysql实现远程访问
    翻下旧资料,发现96年考过foxbase二级
    这几年专注于流程管理与RPA落地
    201521123080《Java程序设计》第10周学习总结
    201521123034《Java程序设计》第十周学习总结
    Beta版本冲刺计划及安排
    团队作业7——Alpha冲刺之事后诸葛亮
    团队作业6——展示博客(Alpha版本)
    团队作业4——第一次项目冲刺(Alpha版本)第一天+第二天+第三天+第四天+第五天+第六天+第七天
  • 原文地址:https://www.cnblogs.com/songhe364826110/p/11546054.html
Copyright © 2011-2022 走看看