Linux系统编程进程间通信——无名管道pipe和命名管道FIFO

一、管道分为无名管道和命名管道

接下来看看《UNIX环境高级编程》的介绍

管道:通常指的是无名管道

二、man手册原型

NAME
       pipe, pipe2 - create pipe

SYNOPSIS
       #include <unistd.h>

       int pipe(int pipefd[2]);

原型:

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

当一个管道建立的时候,他会创建两个文件描述符:fd[0] 与 fd[1]。fd[0]表示读,fd[1]表示写。(怎么记忆比较好呢?我们正常读的顺序为“01”,对应“读写”,有没有好记一点?)

若是想要关闭管道至于要关闭两个文件描述符即可:如close(fd[1])、close(fd[0]);

上图!

温馨提示:管道这里的文件描述符跟文件编程的文件描述符是不一样的。

三、举例子

若要数据流从父进程流向子进程,则关闭父进程的读端(fd[0])与子进程的写端(fd[1]);反之,则可以使数据流从子进程流向父进程:

如图所示:

 

举个例子

文件拷贝(不懂得参考文件编程总结二:https://mp.csdn.net/postedit/88817936)。父进程负责擦源文件的内容读出,然后把内容通过管道传给子进程,子进程把内容从管道读出,写入新文件。

代码实现:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc , char *argv[])
{
        int fdS;
        int fdD;

        int fd[2];
        pipe(fd);


        char readBuf[] = {0};

        if(argc != 3){
                printf("param error!\n");
                exit(-1);

        }

        pid_t pid = fork();        //创建一个子进程

        if(pid != 0){   
                close(fd[0]);        //父进程关闭读端

                fdS = open(argv[1],O_RDWR);

                int size = lseek(fdS,0,SEEK_END);
                lseek(fdS,0,SEEK_SET);

                int n_read = read(fdS,readBuf,size);

                write(fd[1],readBuf,1024);        //父进程将readBuf里面的内容放到管道

        }else{

                close(fd[1]);          //子进程关闭写端      

                read(fd[0],readBuf,1024);           //子进程读取readBuf里面的内容

                fdD = open(argv[2],O_RDWR,0600);

                int n_write = write(fdD,readBuf,strlen(readBuf));

        }

        close(fdS);
        close(fdD);
        close(fd[0]);    //记得关闭哦~
        close(fd[1]);

        return 0;
}


~          

运行如下:


 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值