管道

作者: 静倚晴窗笑此生 | 来源:发表于2019-03-25 20:27 被阅读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)函数创建

    如图所示

    命名管道的创建

    相关文章

      网友评论

          本文标题:管道

          本文链接:https://www.haomeiwen.com/subject/ttqivqtx.html