美文网首页
进程通信之无名管道

进程通信之无名管道

作者: 二进制人类 | 来源:发表于2022-09-28 08:53 被阅读0次

    创建

    #include <unistd.h>
    /**
     * [pipe 创建无名管道]
     * @param pipefd[2] [
     * 是2个元素的数组首元素地址,用来存储创建成功的无名管道的两个文件描述符
        pipefd[0] :管道的读端文件描述符;
        pipefd[1] : 管道的写端文件描述符;
     * ]
     * return [成功返回0,失败返回-1且修改errno的值]
     */
    int pipe(int pipefd[2]);
    

    实例

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    
    int main()
    {
        int ret;
        int pipefd[2];
        pid_t pid;
        char buf[256];
    
        /* 创建无名管道 */
        ret = pipe(pipefd);
        if (ret == -1)
        {
            perror("pipe");
            return -1;
        }
    
        /* 创建一个子进程 */
        pid = fork();
        if (pid == -1)
        {
            perror("fork");
            return -1;
        }
        else if (pid == 0)
        {
            /* 子进程关闭管道文件的读文件描述符 */
            close(pipefd[0]);
            while(1)
            {
                /* 写数据:向管道发送数据 */
                fgets(buf, sizeof(buf), stdin);
                ret = write(pipefd[1], buf, sizeof(buf));
                if (ret == -1)
                {
                    perror("write");
                    return -1;
                }
            }
            close(pipefd[1]);
            exit(EXIT_SUCCESS);
        }
    
        /* 父进程关闭管道文件的写文件描述符 */
        close(pipefd[1]);
        while(1)
        {
            /* 读数据:从管道读取数据 */
            memset(buf, 0, sizeof(buf));
            ret = read(pipefd[0], buf, sizeof(buf));
            if (ret == -1)
            {
                perror("read");
                return -1;
            }
            printf("buf : %s\n", buf);
        }
    }
    

    相关文章

      网友评论

          本文标题:进程通信之无名管道

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