匿名管道介绍

匿名管道是进程间通信(IPC)的一种方式。基本思想是利用内存中共享的一段缓冲区,以文件的方式对缓冲区实现,但因为该文件只存在内存中,无唯一命名,所以称为匿名。

优点:可以进行IPC通信,且相对来说简单;

缺点:半双工方式,即只能单向通信;只能在亲属关系的进程间使用,例如父子进程、兄弟进程。

应用场景:在具备亲属关系的进程间单向通信。如果需要进行双向通信,需要创建两个管道。

原理:首先父进程创建管道fd,父进程采用fork的方式创建子进程,子进程是父进程的副本,所以文件描述符也是复制的,类似于对文件描述符执行dup函数,共享文件表项。因为父子进程共享同一文件表项(缓冲区),所以父子进程可实现通信。

父进程pipe
父进程pipe
fork创建子进程后
关闭父进程读端,关闭子进程写端

以上图例完成父进程向管道写入,子进程读取管道的单向通信的功能。

使用示例:

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
    int fd[2];
    int iRet = pipe(fd);
    if(iRet == -1)
    {
        printf("pipe failed!\n");
        return -1;
    }

    pid_t pid = fork();
    if(pid < 0)
    {
        printf("fork failed!\n");
        return -1;
    }
    else if(pid == 0)
    {
        close(fd[1]);
        char data[1024];
        size_t readBytes = read(fd[0],data,sizeof(data));
        if(readBytes == 0)
        {
            printf("read failed!\n");
            return -1;
        }
        printf("child process receive data:%s\n",data);
    }
    else
    {
        close(fd[0]);
        const char *sendData = "parent process send data to child process";
        size_t writeBytes = write(fd[1],sendData,strlen(sendData)+1);
        if(writeBytes == 0)
        {
            printf("send failed!\n");
            return -1;
        }
        printf("send data to child process success.\n");
    }

    getchar();
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值