管道

man 7 PIPE

pipe和FIFO介绍

pipe匿名管道,只能用于有亲缘关系的进程间通信

FIFO命名管道,任意两个进程间通信

匿名管道

pipe

​ 创建匿名管道,用于进程间通信,必须凑齐读写双方

函数声明

#include <unistd.h>

int pipe(int pipefd[2]);

参数含义

需要一个大小为2的整型一维数组首地址,回填两个文件描述符,pipefd[0]为读端,pipefd[1]为写端。

返回值

成功返回0失败-1

读管道

用read(2)读pipe(2)回填的读端文件描述符

写管道

用write(2)写pipe(2)回填的写端文件描述符

关闭管道

用close(2)关闭读写端两个文件描述符

注意:

lseek(2) 不能作用于管道

uname -r 查看内核版本

fcntl(2)可以用于设置管道容量,管道默认容量为4k

代码示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

#define BUFSIZE 1024

int main(void)
{
    pid_t pid;
    int pfd[2];
    char buf[BUFSIZE] = {};

    if (pipe(pfd) == -1) 
    {
        perror("pipe()");
        exit(1);
    }

    pid = fork();
    if (pid == -1) 
    {
        perror("fork()");
        goto ERROR;
    }
    if (pid == 0) 
    {
        close(pfd[0]);
        write(pfd[1], "hello", 5);
        close(pfd[1]);
        exit(0);
    }

    close(pfd[1]);
    read(pfd[0], buf, BUFSIZE);
    puts(buf);
    close(pfd[0]);

    wait(NULL);

    exit(0);
ERROR:
    close(pfd[0]);
    close(pfd[1]);
    exit(1);
}

命名管道

存在的系统文件

在终端用mkfifo(1)命令创建

在程序中用mkfifo(3)函数创建

如图所示

命名管道的创建
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一般,进程之间交换信息的方法只能是经由fork或exec传送打开文件,或者通过文件系统。而进程间相互通信还有其他技...
    丶Em1tu0F阅读 1,467评论 1 1
  • 前言 管道是UNIX环境中历史最悠久的进程间通信方式,也是最简单的进程间通信方式,一般用来作为IPC的入门,最合适...
    GeekerLou阅读 1,236评论 0 6
  • 原文地址:http://blog.chinaunix.net/uid-27034868-id-3394243.ht...
    Android技术研究阅读 986评论 0 2
  • 没有计划,没有安排,就这样先走起来。 谁的青春不迷茫
    米壳的米壳阅读 328评论 0 0
  • 只有公务员才能写出如此牛X的情书 引导语:金风送爽,丹桂飘香。在这美好的季节里,我终于决定给你写这封信,借此表达我...
    cqqlqbvstg阅读 198评论 0 0