首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux——管道详解

2.管道的读写       管道实现的源代码在fs/pipe.c中,在pipe.c中有很多函数,其中有两个函数比较重要,即管道读函数pipe_read()和管道写函数pipe_wrtie()。...写入函数在向内存中写入数据之前,必须首先检查 VFS 索引节点中的信息,同时满足如下条件时,才能进行实际的内存复制工作: 内存中有足够的空间可容纳所有要写入的数据 内存没有被读程序锁定 如果同时满足上述条件...写入进程实际处于可中断的等待状态,当内存中有足够的空间可以容纳写入 数据,或内存被解锁时,读取进程会唤醒写入进程,这时,写入进程将接收到信号。...当数据写入内存之后,内存被解锁,而所有休眠在索引节点的读取进程会被唤 醒。 管 道的读取过程和写入过程类似。...但是,进程可以在没有数据或内存被锁定时立即返回错误信息,而不是阻塞该进程,这依赖于文件或管道的打开模式。反之,进程可 以休眠在索引节点的等待队列中等待写入进程写入数据。

3K20

UNIX(进程间通信):09 管道到底是什么

2.管道的读写 管道实现的源代码在fs/pipe.c中,在pipe.c中有很多函数,其中有两个函数比较重要,即管道读函数pipe_read()和管道写函数pipe_wrtie()。...写入函数在向内存中写入数据之前,必须首先检查 VFS 索引节点中的信息,同时满足如下条件时,才能进行实际的内存复制工作: ·内存中有足够的空间可容纳所有要写入的数据; ·内存没有被读程序锁定...写入进程实际处于可中断的等待状态,当内存中有足够的空间可以容纳写入 数据,或内存被解锁时,读取进程会唤醒写入进程,这时,写入进程将接收到信号。...当数据写入内存之后,内存被解锁,而所有休眠在索引节点的读取进程会被唤 醒。 管 道的读取过程和写入过程类似。...但是,进程可以在没有数据或内存被锁定时立即返回错误信息,而不是阻塞该进程,这依赖于文件或管道的打开模式。反之,进程可 以休眠在索引节点的等待队列中等待写入进程写入数据。

1.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    PHP进程通信之管道与消息队列(二十三节)

    ---- 管道 管道是我们平时最常见进程间通信方法,一般说有全双工、半双工之说,全双工管道是说管道上的信息可以有来有往,半双工管道则是指只能传递单方向的数据,在APUE里这一部分涉及到的内容十分复杂繁琐...先说下这个叫做posix_mkfifo()的函数,FIFO有些地方叫命名管道,本质上TA是一个文件,你可以用var_dump()来检验一下,FIFO是支持双向通信的: <?...(); // 在子进程中,打开命名管道,并写入一段文本 echo "{$pid} child before fopen FIFO".PHP_EOL; $file = fopen(...这个是非常简单,总之再使用FIFO的时候一定是「一读一写」同时是要配对存在才是正确的用法,如果缺少一个总是会有各种奇怪的现象,再PHP这里表现为进程会阻塞在fopen操作上(纠错:在Advanced-PHP...上述Pyton与PHP这个案例里,ftok这里可能大家会有些疑惑,为什么PHP第二个参数是字母a,而Python里是数字97,实际上我这里得说一下,咱们来把老祖宗的标准先拿出来,在XSI标准里,粗暴点儿说就是你在

    1.4K31

    Docker实现原理学习笔记

    (4)数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。...随着挂载命名空间的添加,mount() 和umount() 系统调用停止在系统上所有进程可见的全局挂载点集上运行,而是执行仅影响与调用进程关联的挂载命名空间的操作。...2、为什么要使用Linux NameSpace隔离进程 个人理解 1、如果我们在一台服务器上启动多个服务,那么他们之前互相可以看到互相的进程,文件等,可能会造成相互的影响,同时他们也都可以访问宿主机的文件...,那么隔离进程能让一台主机,部署多个服务,并且互相不冲突,并且在同一台服务器可以有很高的扩展性与多样性 2、既然在一台机器上部署了多个服务,那么如果其中有一个Web网站被入侵,容器之间没有隔离,或与宿主机之间没有隔离...添加描述 NameSpace Api 添加描述 共有3个系统调用组成命名空间API 1、Clone(2) 添加描述 创建一个新的进程,如果调用的时候传进去了一个或者多个标志参数,那么这些命名参数就是给创建的子进程的

    40520

    Android跨进程通信IPC之1——Linux基础

    前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了"system V IPC",通信进程局限在单个计算机内;而后者则跳过了这个限制,形成了基于套接字(socket)的进程间通信机制。...写入函数在向内存中写入数据之前,必须首先检查VFS索引节点中的信息,同时满足如下条件时,才能进行实际的内存复制工作: 内存中有足够的空间可以容纳所有要写入的数据。 内存没有被读程序锁定。...写进程实际处于可中断的等待状态,当内存中有足够的空间可以容纳写入数据,或内存被解锁时,读取进程会唤醒写入进程,这时,写入进程将接受到信号。...3、命名管道的安全问题: 大家想一下,只使用一个FIFO文件,如果有多个进程同时向同一个FIFO文件写数据,而只有一个读FIFO进程在同一个FIFO文件读取数据时,会发生怎么样的情况呢,会发生数据块的相互交错是很正常的...进程只有处理完信号才会返回用户态,进程在用户态下不会有未处理完的信号。 内核处理一个进程收到的软中断信号是在该进程的上下文中。因此,进程必须处于运行状态。

    1.7K30

    【Linux】从零开始认识进程间通信 —— 管道

    1 为什么要进程间通信 以前我们学习的过程中,进程是具有独立性的。但有些时候需要多个进程进行协同,这时候就需要进程间的通信来保证信息的互通。...一般通信有以下种类: 管道 匿名管道pipe 命名管道 System V IPC 标准 (早期的本地通信) System V 消息队列 System V 共享内存 System V 信号量 POSIX...有个问题:父子既然要关闭不需要的fd那为什么曾经还要打开呢?可以不关闭吗? 如果父进程只打开读写的fd,那么子进程也就只能继承读写的fd,这就坏事了,总得有人写入吧!...管道在通信的时候,是面向字节流的:write 的次数和read的次数不是一一匹配的! 我们让子进程疯狂的写,父进程也一直读。子进程每 1 s写一次,写入时也向标准错误里进行打印(为了好观察)。...这里提一个概念,在管道读写是"原子"的,每个"原子"是 4096 bytes。只有小于这个大小,就不会在读写时被其他人影响。如果大于一个原子的大小,就不能保证安全了。

    12700

    Linux :进程间通信之管道

    4、一般操作系统,会有一个独立的通信模块——隶属于文件系统——IPC通信模块 其中有两套标准 system V && posix 5、基于文件级别的通信方式——管道   1.3 进程间通信的方案设计      ...因此当市面上出现了各种各样的通信方案后,我们需要做两件事 (1)选择一个最合适的方案。(2)需要去定制一个标准(这样强迫大家都遵守这个规则,不同的操作系统在设计的时候就不会有太大差异!!)  ...——>互联网行业标准十分重要,就好比为什么你的华为手机和苹果手机差异很大,但是却能实现通信! 就是因为各个领域都会有佼佼者在定制互联网标准!这样才能保证设备之间的通信!!   ...1.4 进程通信的分类 管道: 匿名管道pipe 命名管道 System V IPC: System V 消息队列 System V 共享内存 System V 信号量 POSIX...二、管道文件 2.1 管道的原理         既然一个文件可以被多个进程打开,那么文件其实就算是一个公共资源,其实也可以做到一个进程读一个进程写,从而实现通信 ——>但是这样会有一个问题,就是数据必须要写到外设上

    7710

    当你在 Linux 上启动一个进程时会发生什么?

    尽管在 OS X 上,人们使用 posix_spawn,而 fork 和 exec 是不提倡的,但我们将讨论的是 Linux。 Linux 中的每个进程都存在于“进程树”中。...为何 fork 并非那么耗费资源(写入时复制) 你可能会问:“如果我有一个使用了 2GB 内存的进程,这是否意味着每次我启动一个子进程,所有 2 GB 的内存都要被复制一次?...然后,当如果任一进程试图写入内存,此时系统才真正地复制一个内存的副本给该进程。如果两个进程的内存是相同的,就不需要复制了。...关于信号处理程序或环境变量的细节会被继承吗?这对我的日常编程有什么实际影响呢? 有可能哦!比如说,在 Kamal 的博客上有一个很有意思的bug。...这意味着,程序从 Python 脚本和从 shell 启动的表现会有所不同。在这种情况下,它会造成一个奇怪的问题。 所以,你的程序的环境(环境变量、信号处理程序等)可能很重要,都是从父进程继承来的。

    1.1K70

    独家 | 一文读懂Hadoop(二)HDFS(上)

    为了达到更高的数据上传效率,已经放松了POSIX标准的要求。 2.4.3 管道复制 当客户端向HDFS文件写入数据的时候,一开始是写到本地临时文件中。...HDFS还为POSIX ACL(访问控制列表)提供了可选的支持,以通过针对特定命名用户或命名组的细粒度规则扩充文件权限。访问HDFS的每个客户端进程都具有由用户名和组列表组成的两部分身份。...存储 由Datanodes通过在本地文件系统上存储块并允许读/写访问来提供。 先前的HDFS架构仅允许整个集群使用单个命名空间。在该配置中,单个Namenode管理命名空间。...4.5.4 ViewF View文件系统(ViewFs)提供了一种管理多个Hadoop文件系统命名空间(或命名空间卷)的方法。它对于在HDFS Federation中具有多个命名空间的集群特别有用。...4.5.4.1 单个Namenode集群 在HDFS联合之前,集群具有单个命名空间,为该集群提供单个文件系统命名空间。如果有多个集群。则每个集群的文件系统命名空间是完全独立和不相交的。

    2.3K102

    文件系统基准测试应用IOR-简介

    IOR 使用 MPI 进行进程同步 - 通常,HPC 集群中的多个节点上会并行运行多个 IOR 进程。作为用户空间基准测试应用程序,它适用于比较不同文件系统的性能。...使用-F(filePerProcess=1)选项将写入单个共享文件切换为每个进程写入一个文件可以显著改变性能:$ mpirun -n 64 ....页面缓存对基准测试的影响实际情况是,IOR 读取的数据实际上并非来自 Lustre;相反,文件的内容已经在缓存,IOR 能够直接从每个计算节点的 DRAM(缓存) 中读取它们。...更好的选择是让每个节点上的 MPI 进程仅读取它们未写入的数据(错开读写)。例如,在每个节点四个进程的测试中,将 MPI 进程到块的映射移动四位,使得每个节点 N 读取节点 N-1 写入的数据。...此基准测试是在单个旋转磁盘上运行的,其速度不超过 130 MB/秒,因此显示性能高于此值的条件得益于一些页面由缓存提供。

    10610

    关于MPI-IO,你该知道的

    文件系统有两个极为关键的角色: 组织和维护文件命名空间 存储文件内容及文件的附加属性 在HPC环境中,我们通常可能会用到网络文件系统(NFS)和并行文件系统。...NFS必须解决的两个问题是: NFS Server如何协调多个客户端共享访问数据 在横向扩展的存储系统中,协调多个服务器的文件操作 标准的NFS Server通常只提供相当有限的并行访问能力,即单个客户端通过单一访问入口来访问数据...因此,在大型并行计算应用中,通常不使用NFS来进行数据访问。并行文件系统通常将单个文件数据分布在多个存储服务器上,而运行在多个计算节点上的并行应用程序的多个任务,经常对单个文件同时发起并发访问请求。...并行文件存储系统可以通过并行的多个IO访问请求,为单个文件提供高水平的读/写带宽。 MPI-IO中间件 在HPC系统中,IO软件栈的中间件通常由MPI-IO的软件类库提供。...上面介绍的类库和接口都使用共享文件系统的方式实现并行IO,允许多个进程写入同一逻辑文件。

    2.2K20

    【Linux】进程间通信 --- 管道 共享内存 消息队列 信号量

    在匿名管道这里,我们通过fork创建子进程,让子进程继承父进程的文件描述符表,这样子进程中会有一个指向匿名管道文件的文件描述符,并且父进程也会有这样的文件描述符,当然是在fork之前,父进程要打开一个管道文件...我们可以让父进程创建出多个子进程,通过打开多个对应的管道文件和每个子进程建立通信的前提,然后我们可以通过管道的读写规则其中的一条,也就是当写入端写入很慢时,读取端进行阻塞等待。...其实上面的代码中有一个隐含的问题,只不过这个问题并不影响我们的程序运行。...,如果是这样的话,在创建子进程函数调用结束之后,所有的子进程都不会有继承下来的wfd了,因为我们在创建的每个子进程代码内部将继承下来的wfd全都关闭了。...在应用层也就是用户层,我们只能操作虚拟地址,但内核中会有MMU进行虚拟地址的映射,所以进程在IPC时,只需要操纵虚拟地址即可,从虚拟地址中读取或向虚拟地址中进行写入,这样就完成了共享内存式的IPC。

    1.5K40

    IOR中文文档

    使用-F(filePerProcess=1)选项,从向单个共享文件写入到每个进程写入一个文件,会改变性能有了很大的改变。 $ mpirun -n 64 ....更具体地说,尽管每个IOR进程认为它是在向Lustre上的一个文件写入,然后从Lustre上读回文件的内容,但实际上它是在 向缓存在内存中的文件副本写入数据。...一个更好的选择是让每个节点上的MPI进程只读取它们没有写入的数据。比如说。在一个每节点四个进程的测试中,将MPI进程与块的映射转移四次,使每个节点N读取节点N-1写入的N-1节点写入的数据。...它由一个或多个传输组成(默认:1048576)。 transferSize - 在一次I/O调用中传输的单个数据缓冲区的大小(字节)(默认值:262144)。...不可压缩性的 缓冲区在写入前只被填充一次,所以如果压缩算法使用的块大于传输的 大小,就会有压缩。下面是zip、gzip和bzip的一些基线。 zip。对于压缩文件,传输大小为1k就足够了。 gzip。

    6K10

    「首度揭秘」大规模HPC生产环境 IO 特征

    论文首次量化了文件中有很大一部分是读密集型的文件(占22%),小部分是写密集型文件(占7%),这7%的文件被不断写入,但未被读取。有71%的HPC文件是RW文件(即读写密集型文件)。...因此,对于大多数文件,有两个或多个应用程序充当生产者和使用者,而不只是被单个应用程序访问。...接下来,作者研究变化的OST争用将如何影响各个并发运行的进程的IO时间,这些进程可能并行访问不同的OST。...另一方面,图8(c)显示了每次任务中单个进程内每个文件执行IO时间的标准差(用于描述不同进程执行IO时间的波动情况)。对于使用POSIX接口执行的IO,此标准差特别高。...因此,当使用POSIX IO时,这些OST上不同的资源争用级别会极大地影响各个进程的IO时间。 ? 发现8.

    1.2K51

    写给大忙人看的操作系统

    磁盘访问慢的原因是因为磁盘的构造不同 磁盘是一种机械装置,在一个磁盘中有一个或多个金属盘片,它们以 5400rpm、7200rpm、10800rpm 或更高的速度旋转。...当进程 A 相对进程 B 发送数据时,它把数据写到管道上,相当于管道就是输出文件。这样,在 UNIX 中两个进程之间的通信就非常类似于普通文件的读写了。...下面,我们会列出一些常用的 POSIX 系统调用,POSIX 系统调用大概有 100 多个,它们之中最重要的一些调用见下表 进程管理 调用 说明 pid = fork() 创建与父进程相同的子进程...从宏观角度上看,这些系统调所提供的服务确定了多数操作系统应该具有的功能,下面分别来对不同的系统调用进行解释 用于进程管理的系统调用 在 UNIX 中,fork 是唯一可以在 POSIX 中创建进程的途径...在 fork 之后,原有进程以及副本(父与子)就分开了。在 fork 过程中,所有的变量都有相同的值,虽然父进程的数据通过复制给子进程,但是后续对其中任何一个进程的修改不会影响到另外一个。

    29920

    【文件系统】使用iozone测试你的文件系统是否可靠

    -C 在吞吐量测试中显示每个子进程传输的字节数。如果你的操作系统在文件I/O或进程管理中有任何饥饿问题,这很有用。 -d # 在屏障外的微秒延迟。...— -T 使用POSIX pthreads进行吞吐量测试。在具有POSIX线程的平台上可用 — -u # 设置要运行的进程数的上限。当运行吞吐量测试时,此选项允许用户指定要启动的最大进程或线程数。...此标志的用途有限,当单个重新测试不够时,或者在不截断或删除文件的情况下轻松控制顺序写入重新测试的时间。 — -+u 开启CPU利用率模式。 — -+d 开启诊断模式。在这种模式下,每个字节都被验证。...系统在此类活动下的性能会受到多种因素的影响,例如:操作系统缓存的大小、磁盘数量、寻道延迟等。 — Random Write 该测试测量写入文件的性能,访问文件中的随机位置。...同样,系统在此类活动下的性能可能会受到多种因素的影响,例如:操作系统缓存的大小、磁盘数量、寻道延迟等。 此测试仅在吞吐量模式下可用。 每个线程/进程运行读取或写入测试。

    9410

    【Linux】进程间通信之匿名管道

    一、基本概念 我们知道多个进程之间是互相独立的,但是有时候我们需要将一个进程的数据传递到另一个进程,实现数据传输的效果,有的时候多个进程之间要共享同样的资源,有的时候一个进程要对其他进程发送消息,实现通知事件...,因为这样会破坏进程独立性,我们进程访问第三方空间本质上就是访问操作系统 一般操作系统会有一个独立的通信模块,隶属于文件系统,它被制定者制定了两个标准system V 和 posix ,其中system...V 是本机内部进程间的通信,分为消息队列、共享内存、信号量,posix 是网络进程通信,分为消息队列、共享内存、信号量、互斥量、条件变量、读写锁 在进程间通信的规则指定之前,还没有system V 和...posix 的时候,我们是通过管道进行进程间通信的,这是一种基于文件的通信方式 二、管道 1、温故知新 我们在之前的学习命令行的过程中学习过管道,那里的管道与这里的管道是一致的,本质上就是一个管子,在两头位置处有两种处理方式...,有人说这里不是没写完就读取吗,你看这个句子一段一段的,其实这里是缓冲区写满了,写不下了,写入端堵塞导致的,在读取端读取之后写入端才继续写入,正好也印证了上面的说法 今日分享就到这里了~

    6710

    C和C++安全编码笔记:文件IO

    命名管道(named pipe)使不同的进程能够通信,并可以在文件系统中的任何地方存在。创建命名管道的命令是mkfifo,如mkfifo mypipe。它们用权限字符串中的第一个字母p来表示。...因此,尚未写入到磁盘中的缓冲数据可能会丢失。Linux保证,甚至在程序异常终止时,这个数据也被刷新到磁盘文件。  POSIX:除了支持标准的C文件I/O函数,POSIX定义了一些自己的文件I/O函数。...在POSIX中,操作系统存储一个称为umask的值,它用来在每个进程创建新文件时代表该进程。umask可以用于禁用由创建文件时的系统调用指定的权限位。umask仅适用于文件或目录的创建。...在目的是普通字符或二进制文件的设备文件上执行操作,可能会导致崩溃和拒绝服务攻击。当攻击者可以用未经授权的方式访问UNIX中的设备文件时,可能会有安全风险。...当竞争条件产生自不同进程时,仅当同步对象都位于共享内存并被多进程感知到,才能使用线程同步原语。在不同的进程间实现互斥的常用缓解方案是使用Windows具名的互斥体对象或POSIX命名信号。

    98500

    【Linux】基于管道进行进程间通信

    其中有以下几种目的: 数据传输:一个进程需要将它的数据发送给另一个进程; 资源共享:多个进程之间共享同样的资源; 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程...进程间通信分类 基于文件级别的通信方式 - - - 管道 匿名管道 pipe 命名管道 System V IPC System V 消息队列 System V 共享内存 System V 信号量 POSIX...如下图: 接下来父进程在 fork 创建子进程,子进程它会拷贝父进程的文件描述符表,所以它们都会有对应的读写端指向管道,如下: 紧接着需要结合具体场景,我们是想让父进程读,子进程写,还是子进程读、父进程写...我们可以在系统中查看一下,指令为 ulimit -a,ulimit 是一条命令,用来查看操作系统对于很多重要资源的限制,如下: 我们可以看到,8指的是单个进程可以打开文件的个数,大小是512字节,所以管道的大小也就是...如果我们一直往管道里写,该管道的大小也不会有变化,这就是命名管道: (2)理解命名管道 那么关于命名管道的理解,首先,如果两个不同的进程打开同一个文件的时候,在内核中,操作系统会打开几个文件呢?

    22310
    领券