管道实现进程间通信

本文介绍了Linux下管道实现进程间通信的原理和步骤,包括匿名管道和命名管道。匿名管道适用于有血缘关系的进程,而命名管道能实现任意进程通信。管道具有单向通信、生命周期随进程等特点,同时文章通过代码示例展示了管道的创建和使用,讨论了使用中可能出现的四种情况。
摘要由CSDN通过智能技术生成

一、

实现进程间通信最简单的方式就是通过管道机制来实现,管道是一种最基本的IPC机制,由pipe函数创建。pipe所创建的管道实际上是在内核中开辟一块缓冲区,它有一个独端和写段,通过read和write来实现往管道里写和读,由于管道是通过父进程调用pipe函数所产生的管道,所以和它通信的只能是它的子进程或者和它有血缘关系的进程。后面一会具体讲。先通过图示来看看管道是怎么来实现通信的




通信机制:

1、父进程先通过调用pipe函数创建一个管道。父进程的文件描述符读和写分别指向管道的两端。

2、父进程通过调用fork函数来创建子进程,然后子进程的文件描述符的读和写也分别指向管道的两端。

3、父进程关闭自己的读端,子进程关闭自己的写端。然后父进程往管道里写东西,子进程从管道里读东西,以此来实现父子进程之间的通信。


管道的特点:

1、管道只能进行单向通道。f[0]为读,f[1]为写。

2、只有具有血缘关系的两个进程才能用管道来通信。

3、管道是面向数据流的服务。

4、管道的生命周期随进程。

5、同步与互斥


先来看看父进程如何通过代码来创建管道,并且和子进程连接上的。

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

int main()
{
    int _pipe[2];
    int ret = pipe(_pipe);
    if(ret == -1)
    { 
        perror("errno");
        return 1;
    }

    pid_t id = fork();
    if(id < 0)
    {
        perror("errno");
        return 2;
    }
    else if(id == 0)
    {//child
        close(_pipe[0]);
        int i = 0;
        char *msg = NULL;
        while(i<100)
        {
            msg = "hello pipe! i am child!\n";
            write(_pipe[1],msg,strlen(msg));
            sleep(1);
            printf("pipe count %d\n",i++);
        }
        exit(0);
    }
    else{//father
        close(_pipe[1]);
        char _msg[100];
        int i = 0;
        while(i<100){
            int ret = read(_pipe[0],_msg,sizeof(_msg));
            printf("%scode is:%d\n",_msg,ret);
        }
    }
    return 0;
}

这个管道里子进程先
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值