Linux进程间通讯 -- 管道

Linux进程间通讯 – 管道

1. 原理

Linux 进程间通讯,也称为IPC(InterProcess Communication)

在 Linux 中每个进程都具备独立的进程地址空间,对每个进程的独立地址空间进行划分,在0G - 3G部分被划分为用户空间,而3G - 4G部分被划分为内核地址空间。注意此0G - 4G 为虚拟地址空间,实际上会通过MMU映射到物理地址空间。

在进行地址映射的时候,每个进程的用户空间在实际物理空间上将被映射到多个地址空间,而多个进程的内核空间将会被被映射到同一块区域,因此多个进程之间具备相同的内核地址空间,通过此共同的内核地址空间实现线程间数据交互即为进程间通讯,也即IPC。
在这里插入图片描述

2. 进程间通讯

Linux进程间通讯的方式主要分为以下四大种类型:

  1. 管道 pipe
  2. 信号 signal
  3. 共享映射区 mmap
  4. 本地套接字 socket

2.1 管道

使用管道实现进程间通讯的优点是:使用简单!

管道分为有名管道 FIFO 和匿名管道 pipe,匿名管道仅能用于具备血缘关系的进程间通讯;而有名管道因其具备了名字可以被找到,因此可用于无血缘关系的进程间通讯。

管道本质是一个伪文件,是由内核管理的一个缓冲区,同时此缓冲区被设计成环形,具备两个端口,一端连接数据的写入,一端连接数据的输出,因此管道仅可用于单向通讯的场合

当管道中无有效数据时,从管道中读取数据时进入阻塞等待状态,直至有数据从管道的写端写入。

当管道中数据被写满时,再次往管道内写入数据会进入阻塞等待状态,直至有数据从管道的读端被读走。

2.1.1 匿名管道 pipe

创建管道:

#include <unistd.h>

int pipe(int pipefd[2]);
  • 传入参数:包含两个文件指针的数组,pipefd[0] 指向管道的读端;pipefd[1] 指向管道的写端
  • 返回值:0:成功 -1:失败

示例:

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

int main(int argc, char **argv)
{
   
   
    int fd[2] = {
   
    0 };
    int ret = 0;
    pid_t pid = 0;
    char buf[512] = {
   
   0};

    ret = pipe(fd);
    if (ret < 0) {
   
   
        perror("create pipe failed");
        return -1;
    }

    pid = fork(
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱出名的狗腿子

你的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值