进程间通信(二):管道

本文详细介绍了Linux中的管道通信机制,包括无名管道(PIPE)、命名管道(FIFO)、socketpair以及命令行管道的原理和使用方法。通过实例展示了如何在不同进程间进行数据传递,帮助理解管道在进程通信中的作用。
摘要由CSDN通过智能技术生成

前言

管道是一种非常古老的进程通信机制,在目前的Linux操作系统中也随处可见,本文我们来探讨一下不同类型管道的机制和使用方法。

原理

Linux文件系统(一)中我们提到过文件的类型,其中一类文件类型就是管道文件,实际上,管道的实现原理正是借助了文件系统来实现的,下图展示了管道的读写过程。
在这里插入图片描述
读进程和写进程分别打开一个file结构体并链接到同一个i-node,通过i-node找到对应数据页进行读写。

PIPE

pipe被称为无名管道,是一种只能用于亲缘关系间的单工通信方法,pipe使用下面的函数创建:

#include <unistd.h>

int pipe(int fd[2]);        //成功返回0,失败返回-1

fd数组为传出参数,传出的两个文件描述符fd[1]为读端,fd[0]为写端,通常先调用pipe函数,然后fork出子进程,子进程将继承父进程的文件描述符,因此将集成fd数组,此时将子进程的读端关闭,父进程的写端关闭,就可以从子进程发送消息至父进程,反之则可以从父进程发送消息给子进程,上述过程的代码实现如下:

#include <unistd.h>
#include <iostream>
#include <cstring>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(){
   
    int fd[2];
    if(pipe(fd)<0){
   
        std::cout << "create pipe failed:" << strerror(errno) << std::endl;
    }
    pid_t pid = fork();
    if(pid<0){
   
        std::cout << "fork failed:" << strerror(errno) << std::endl;
    }
    else 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值