管道

2019-03-25  本文已影响0人  静倚晴窗笑此生

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)函数创建

如图所示

命名管道的创建
上一篇下一篇

猜你喜欢

热点阅读