`
memorymyann
  • 浏览: 270688 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

linux中的管道实现和管道

阅读更多

inux的shell中有个很常用的东西管道,很多人认为他是shell的精华了(我没什么感觉,可能是用的比较少的原因),意思就是把一个命令的输出,作为另一个进程的输入。而在上操作系统课程时候,老师曾经给我们讲过进程通信中的管道这一个概念。在linux具体的实现就是pipe函数,可以说这个和shell中的管道,我认为就是一个东西,shell中的管道就是用pipe函数来实现的(有点武断,因为我没看过 shell的源代码)。为了说明这一点,我们写一个程序来模拟管道。

 

具体例子:我们输入 ls -l | wc这是一个管道的简单例子,大家可以自己试试,可以通过man帮助来查查这个指令的意思,应该不难。

 

前提知识介绍:

1.文件的数据结构描述:管道通信,就是在2个进程间建立一个管道(其实具体是的实现,是一个虚拟的文件,这个文件只存在于内存中,所以是个虚拟的)一个进程掌握写入段,另一个掌握读出段。linux把设备看作文件,以前我们就说过标准输入是0,输出是1,错误输出是2。具体的意思是:每个进程都有一个files数组,files[0]就是键盘了(一般是,我们程序就不是了,我们改掉了), files[1]就是显示器, files[2]是错误输出(应该是null)。

 

我们的思路是:由父进程创建2个子进程b 和c,父进程传建一个管道,管道是个虚拟文件,我们把这个文件输出段,其实也是一个file结构替换掉子进程的标准输入文件,输入段替换掉子进程的标准输入文件,这样我们就是先了shell中的管道。

 

具体代码:

[root@liumengli pipe]# cat pipe_father_3.c
#include "stdio.h"
#include "unistd.h"

int main() {
        pid_t child_b, child_c;
        int pipefds[2]; //[0] for read, [1] for write
        char * arg1[] = {"/usr/bin/wc", NULL};
        char * arg2[] = {"/bin/ls", "-l", NULL};

        //父进程
        pipe(pipefds); // 开始创建管道的2段

        if(!(child_b = fork())) { //创建子进程b
                close(pipefds[1]); /* 关掉管道的读取端*/
                close(0); //关掉b进程的标准输入文件,其实就是键盘
                dup2(pipefds[0], 0); //将我们管道的输出段复制到 b进程的标准输入中
                close(pipefds[0]); //关掉输出
                execve("/usr/bin/wc", arg1, NULL); //执行wc进程
                printf("pid is %d, wc\n", getpid()); //只有出错才会到这里
        }
        close(pipefds[0]); /*close read*/

        if(!(child_c = fork())) { //创建子进程c
                close(1); //和上面雷同
                dup2(pipefds[1], 1);
                close(pipefds[1]);
                execve("/bin/ls", arg2, NULL);
                printf("pid is %d, ls\n", getpid());
        }

        close(pipefds[1]);
        wait4(child_b, NULL, 0, NULL);
        return 0;
}

[root@liumengli pipe]# ls -l | wc
     15     128     763
[root@liumengli pipe]# ./pipe_father_3
     14      128    763

分享到:
评论

相关推荐

    Linux管道实现机制

    ### Linux管道实现机制详解 #### 一、概述 在Linux操作系统中,管道是一种重要的进程间通信(IPC)机制,主要用于连接两个进程的标准输入和标准输出,实现数据的单向传递。根据是否有名称,管道可以分为两种类型:...

    Linux系统管道和有名管道的通信机制

    当读取数据量大于`PIPE_BUF`(定义在`<linux/limits.h>`中,通常为4096字节)时,返回当前管道中的数据量;小于`PIPE_BUF`时,要么返回实际数据量,要么返回请求的字节数,取决于哪个值较小。如果试图从写端读取或向...

    Linux命名管道示例

    接下来,我们将构建两个简单的程序:一个是生产者(producer),负责向管道中写入数据;另一个是消费者(consumer),负责从管道中读取数据。以下是一个简单的Python示例: **producer.py** ```python import os ...

    linux下C和java通过管道通信

    在Linux操作系统中,C语言和Java程序之间的通信可以通过多种方式实现,其中管道(Pipe)是一种常见且基础的进程间通信(IPC, Inter-Process Communication)机制。本篇将详细讲解如何利用管道实现在Linux下的C和Java...

    实验四:Linux下进程管道通信.docx

    父进程负责读取管道中的数据,并将两个子进程的消息都显示在屏幕上。这展示了一个管道如何处理多个进程同时写入的情况。 ### 任务3 任务三是探索是否可以创建一个管道让两个子进程直接通信。通常,管道是单向的,...

    Linux下管道通信的实现.pdf

    Linux 管道通信实现 ...Linux 管道通信是 Linux 操作系统中的一种重要的进程通信方式,可以实现多个进程之间的信息共享和数据交换。然而,管道通信也存在一些缺点,需要正确地管理和释放系统资源。

    LINUX管道通信实验报告

    本实验旨在深入理解和掌握Linux管道通信的基本概念、工作原理及实际应用。 一、管道基本原理 管道是Linux内核提供的一种半双工通信方式,数据只能单向流动,且两个进程之间必须有亲缘关系(通常是父子进程或兄弟...

    linux中管道通信的例子,获取标准输出的内容

    这是一个演示linux下线程之间如何进行通讯的例子,使用了管道技术。主要使用了popen函数

    linux 命名管道创建及使用demo程序

    1. 在程序中创建命名管道 在程序中创建命名管道,可以使用 mkfifo 函数,其原型如下: #include #include int mkfifo(const char *pathname, mode_t...删除命名管道和删除一个普通文件没有什么区别: $ rm /tmp/testp

    电子科大操作系统实验课Linux通过管道实现进程间通信

    父进程在所有子进程完成后关闭写端,只保留读端,从管道中读取并打印信息。 5. **代码流程**: - 主程序`main()`中,首先调用`pipe()`创建管道,然后`fork()`创建子进程P1,P1关闭读端,写入消息并退出。 - 父...

    linux命名管道write

    linux命名管道两个进程之间相互通信的程序(write.c和read.c两个程序)

    基于Linux管道技术的编程方法研究.pdf

    综上所述,Linux管道技术,尤其是命名管道,是实现进程间通信的重要手段。在实际开发中,结合dbm数据库和客户端/服务器模型,可以构建出高效、稳定的网络应用系统。开发者需掌握相关工具和编程技术,以充分利用Linux...

    linux实现软中断通信和管道通信报告(含代码)

    ### Linux实现软中断通信和管道通信相关知识点 ...通过以上知识点的学习,我们能够更好地理解和实现Linux中的软中断通信和管道通信。这些技术对于深入理解进程间通信机制非常有帮助,也是编写高效可靠软件的基础。

    用linux语言编程的管道通信程序

    子进程(生产者)向管道中写入信息,而父进程(消费者)从管道中读取并显示这些信息。 代码中包含了以下关键知识点: 1. **管道创建**:`pipe(fd)` 这一行代码用于创建一个管道,fd 是一个包含两个文件描述符的...

    linux 无名管道使用示例

    linux 父子进程间 使用无名管道通信

    Linux 管道

    Linux管道作为一种轻量级的IPC机制,具有简单、高效的特点,广泛应用于各种命令行工具和shell脚本中。理解和掌握管道的使用,能帮助我们在Linux环境下更高效地管理和操控系统资源。同时,通过扩展到更复杂的进程通信...

    Linux实验八:LinuxC-编程-IO-重定向和管道.doc

    通过这些实验,你可以深入理解Linux系统中I/O重定向和管道的工作原理,以及如何在C程序中实现它们。这些基础知识对于系统级编程和shell脚本编写非常重要,因为它们允许我们灵活地控制程序的输入输出,以及在不同进程...

    linux 进程管道通信 实例

    这个简单的`fork.c`示例展示了如何在Linux中实现进程管道通信。管道通信适用于小量、实时性要求高的数据传输,但不适合大量数据交换,因为管道的缓冲区大小有限。在实际应用中,根据需求可以选择其他IPC机制,如消息...

Global site tag (gtag.js) - Google Analytics