Linux下管道的运行原理及实现

管道(PIPE)

  1. 管道的运行原理

    管道是一种最基本的IPC机制,由pipe函数创建:

    #include<unistd.h>

    int pipe(int filedes[2]);

    调用pipe函数时在内核中开辟一块缓冲区用于通信,它有一个读端和一个写端,通过filedes参数传出给程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端。管道就像一个打开的文件,通过read(filedes[0]);或者write(filedes[1]);向这个文件读写数据,其实是在读写内核缓冲区。pipe函数调用成功返回0,调用失败则返回-1。通信的步骤如下:

    <1>父进程创建管道

    父进程调用pipe开辟管道,得到的两个文件描述符指向管道的两端。

    <2>父进程fork出子进程

    父进程调用fork创建子进程,则子进程也有两个文件描述符指向同一管道。

    <3>父进程关闭fd[0],子进程关闭fd[1]

    父进程关闭管道读端,子进程关闭管道写端。父进程可以往管道里写,子进程可以从管道里读,管道是用环形队列实现的,数据从写端流入从读端流出,即实现了进程间通信。

    可见,Linux中创建进程是从父进程"fork"出来,然后再execve(把当前程序替换成要执行的程序),而不是在创建时就指定它要运行的函数,完成独立的创建,这样天然的进程的继承关系,为管道的实现提供了很大方便,因为管道的实现利用了子进程继承父进程的文件描述符表这一特性。

  2. 管道使用时的特殊情况

    <1>所有指向管道写端的文件描述符都关闭了(管道写端的引用计数等于0),而仍然有进程从管道的读端读数据时,那么管道中剩余的数据都被读取后,再次read会返回0,就像读到文件末尾一样。

    <2>指向管道写端的文件描述符没关闭(管道写端的引用计数大于0),而持有管道写端的进程也没有向管道中写数据,这时有进程从管道读端读数据时,管道中剩余的数据都被读取后,再次read会阻塞,直到管道中有数据可读了才读取数据并返回。

    <3>所有指向管道读端的文件描述符都关闭了(管道读端的引用计数等于0),这时有进程向管道的写端write,那么该进程会收到信号SIGPIPE,通常会导致进程异常终止。

    <4>指向管道读端的文件描述符没关闭(管道的引用计数大于0),而持有管道读端的进程也没有从管道中读数据,这时有进程向管道写端写数据,那么在管道被写满时再次write会阻塞,直到管道中有空位置了才写入数据并返回。

  3. 底层实现

    查看我的平台下管道写满能写多少?

时间: 2024-10-18 10:32:48

Linux下管道的运行原理及实现的相关文章

linux下的QQ运行玩法:pidgin-lwqq

安装pidgin: sudo apt-get install pidgin 安装pidgin-lwqq: sudo add-apt-repository ppa:lainme/pidgin-lwqq sudo apt-get update sudo apt-get install libpurple0 pidgin-lwqq 然后: 选择WebQQ选项,剩余的自己就会捣鼓了. linux下的QQ运行玩法:pidgin-lwqq,布布扣,bubuko.com

(转)linux下文件删除的原理精华讲解(考试题答案系列)

linux下文件删除的原理精华讲解(考试题答案系列) 说明:本文为老男孩linux培训某节课前考试试题及答案分享博文内容的一部分,也是独立成题的,你可以点下面地址查看全部的内容信息.http://oldboy.blog.51cto.com/2561410/791245 5.描述linux下文件删除的原理(记时3分钟)<?xml:namespace prefix="o"> ?xml:namespace> Linux文件删除原理:     Linux是通过link的数量来

linux下nginx+php-fpm运行用户以及资源目录的权限

最近研究了下linux下nginx+php-fpm等web服务的运行用户,和web目录的权限 之前以为,nginx php-fpm 等服务,是用户登入的linux服务器上后, 然后运行对应的服务, 该服务就是以那个用户身份在跑的,后面发现是错的, 普通用户登入,没有权限启动服务. google,下,找同事了解到, 猜发现, 服务的运行身份都是在配置文件中配置的, 如nginx服务, 在nginx.conf的开头有user [用户名]  这就表示以填写的用户运行该模式了. 对应的web资源,必须对

linux下,一个运行中的程序,究竟占用了多少内存

1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中  VSZ(或VSS)列 表示,程序占用了多少虚拟内存. RSS列 表示, 程序占用了多少物理内存. 虚拟内存可以不用考虑,它并不占用实际物理内存. (2). top 命令也可以 其中  VIRT(或VSS)列  表示,程序占用了多少虚拟内存. 同 ps aux 中的 VSZ列 RES列 表示, 程序占用了多少物理内存.同 ps aux 中的RSS列 2.在linux下, 查看当前系统占用

linux下使用mono运行vs程序和windows下的一些区别

目录: windows服务中,如果在程序中写“a.txt”:它指的并非是服务运行文件所在目录:而linux则指的是运行文件目录. 时间: windows下的ToShortDateString为“1990-01-01”格式,而linux下为“1/1/1990”格式,linux下的这种格式在向mysql数据库中的date类型字段填充时会报格式不正确的错误.

Linux系统发展和运行原理

本文属作者本人观点,若理解错误,欢迎指正. 操作系统简介 计算机的出现是因为战争的需要,随着计算机的诞生,操作系统也就应运而生.可以说计算机的发展史,相对来说是比较快速的发展.尤其是在当代中国,计算机更是经历了飞速的发展.操作系统对于计算机的重要性不言而喻,它是布置在硬件系统上的第一个软件,也是其他应用软件运行的基础,是人与硬件之间的接口.可以说,没有操作系统,计算机硬件,就是一堆废铁.就现在社会,比较主流的操作系统主要有在服务器端运行的Linux,以及桌面操作系统,Windows和MacOS等

linux下命令行运行jar文件出错

我将程序打包成了jar包,在windows下执行时正确的,但是放在linux下执行就不对了.windows目录下包括jar包和一个lib文件夹,此文件夹下是需要的其他类库.linux目录是一样的结构.但是在linux下执行,可以执行main,但是找不到类.这是MANIFEST文件内容:Manifest-Version: 1.0Class-Path: lib\axis.jar lib\commons-discovery-0.2.jar lib\javax.wsdl_1.6.2.v201012040

linux下的文件删除原理

Lniux下控制文件真正被删除的计数器 Linux是link的数量来控制文件删除的.只有当一个文件不存在任何link的时候,这个文件才会被删除.一般来讲,每个文件都有两个link计数器:i_count和i_link i_count的意义是当前文件使用者(或被调用)的数量 当一个文件被某一个进程引用时,对应的这个值就会增加 i_nlink的意义是介质连接的数量(硬链接的数量) 当创建文件的硬链接的时候,这个值就会增加 可以理解为i_count是内存引用计数器,i_nlink是硬盘的引用计数器 rm

Linux下文件删除的原理

Linux文件删除的原理: Linux是通过link的数量来控制文件的删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除,一般来说每个文件都有2个link计数器:i_count和i_nlink. i_count的意义是当前文件使用者(或被调用)的数量i_nlink的意义是介质连接的数量(硬连接的数量):可以理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器 当一个文件被某一个进程引用时,对应i_count数就会增加,当创建文件的硬连接的时候,对应i_nlink