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

linux系统编程之管道(一):匿名管道和pipe函数

父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。 2. 父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。 3. 父进程关闭管道写端,子进程关闭管道读端。...子进程可以往管道里写,父进程可以从管道里读,管道是用环形队列实现的,数据从写端流入从读端流出,这样就实现了进程间通信。...,而wc 从管道里读取,现在使用dup2复制文件描述符,使ls 的标准输出为管道,wc 的标准输入也为管道,即使父进程先被调度,因为默认是阻塞I/O操作,故wc 会read 阻塞直到管道被子进程写入了数据...使用管道有一些限制: 两个进程通过一个管道只能实现单向通信,比如最上面的例子,父进程读子进程写,如果有时候也需要子进程读父进程写,就必须另开一个管道。...管道的读写端通过打开的文件描述符来传递,因此要通信的两个进程必须从它们的公共祖先那里继承管道文件描述符。

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

    Linux系统命令找不到了,只能重装系统?

    环境变量问题,导致大部分命令无法使用,环境变量临时修改不生效,也没办法,最终打算重做系统 重做系统,抛开数据不说,系统上所有环境都要重新搭建,当然不是最佳选择 其实系统层面的问题,不管是windows还是...,我先得把系统搞挂,所以先做个快照 ?...现在就进入救援模式了,我们看下原来的系统,也就是/mnt/sysimage下面,是不是我原来的系统 ?...拷贝完之后,关机,把光盘弹出,重新启动进入系统,重启之后会做一次文件系统的恢复,需要比较长的时间,耐心等着就好 ?...重启之后,即可登录系统,正常使用命令,不过如果之前有安装应用的话,因为这里只是从镜像中复制了系统基础命令,安装后的应用命令没办法恢复了 仅作为一个思路,如果有系统类问题,可以通过这样的方式进行修复 话题

    4.8K10

    Linux系统编程-进程间通信(管道)

    管道---无名管道—命名管道---文件--FIFO 3. 消息队列 4. 共享内存 5. 信号量集 6....标准流管道 标准流管道像文件操作有标准io流一样,管道也支持文件流模式。用来创建连接到另一进程的管道popen和pclose。...无名管道 无名管道用于有亲戚关系的进程间通信。 比如: 兄弟进程、父子进程等。...命名管道 无名管道只能在亲缘关系的进程间通信大大限制了管道的使用,有名管道突破了这个限制,通过指定路径名的形式实现不相关进程间的通信,因为命名管道通信使用的管道是一个实体文件,在磁盘上的存在的,而无名管道是存在内存中的虚拟文件...4.1 在命令行如何创建管道文件?

    1.2K50

    【操作系统】进程间的通信——管道

    进程间的通信—管道 管道 进程间的通信(IPC-Inter-Process Communication)有多种方式,管道是其中最基本的方式。 管道是半双工的,即是单向的。...单进程中的管道:int fd[2] 使用文件描述符fd[1],向管道写数据。 使用文件描述符fd[0],从管道中读数据。 注意: 单进程中的管道无实际用处,管道用于多进程间通信。...---- 管道的使用 实例1: 单进程使用管道进行通信 注意:创建管道后,获得该管道的两个文件描述符,不需要使用普通文件操作中的open操作。...补充: dup函数 功能:使用dup函数复制一份原来的文件描述符所指向的内容,并且使用当前系统(进程)可使用的最小文件描述符。...相关参考——linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用 main5.c #include #include

    68120

    匿名管道和命名管道

    ),然后用户层缓冲区通过系统调用(write)写到管道里,然后再通过read系统调用,被对方(读端)读取,就要从管道拷贝到读端,然后再显示到显示器上。...通信是为了更好的发送变化的数据,管道本质上是文件 所以必须要用到系统调用接口来访问管道,其是由系统管理,read和write ,操作系统相当于中介 结论:管道的特征: 1:具有血缘关系的进程进行进程间通信...2:管道只能单向通信 3:父子进程是会进程协同的,同步与互斥的--保护管道文件的数据安全 4:管道是面向字节流的 5:管道是基于文件的,而文件的生命周期是随进程的 再测试,把子进程sleep去掉,就是让子进程写快一点...,还得把用户层缓冲区拷贝到管道里,(从键盘里输入数据到用户层缓冲区里面),然后用户层缓冲区通过系统调用(write)写到管道里,然后再通过read系统调用,被对方(读端)读取,就要从管道拷贝到读端,然后再显示到显示器上...2号系统调用接口 创建一个管道,p开头就是命名管道,并不会直接刷新到磁盘中,实际是个符号 这样会阻塞 这样会显示出来(先输入左边的,再输入右边的就会显示),左右两边是两个进程 >>追加写入的方式,但空间一直是

    15610

    【Linux】管道通信——命名管道

    命名管道 什么是命名管道 命名管道,也称为 FIFO(First In First Out),是一种 进程间通信(IPC) 机制,它允许不相关的进程(即没有父子关系的进程)通过文件系统中的特殊文件进行数据传输...无名管道 类型 说明 适用场景 匿名管道 pipe() 创建,仅限于父子进程之间通信 适用于父进程创建子进程并通信 命名管道 mkfifo() 创建,存在于文件系统中,可用于任意进程间通信 适用于独立进程间通信...如何创建命名管道 手动创建命名管道: mkfifo FIFO 这个FIFO也是一个文件,被操作系统特殊标记过,是管道文件。...总结来说,命名管道是一种简单、高效、灵活的 IPC 机制,适用于轻量级的数据传输需求,在系统编程和日常应用中都有着广泛的应用。...通过实践,我们也看到了命名管道的易用性与强大功能,它使得开发者能够更加高效地实现进程间的数据交换,促进了软件系统的模块化与解耦。

    10610

    linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF

    ,直到有进程读走数据 O_NONBLOCK enable:调用返回-1,errno值为EAGAIN 管道是一块内存缓冲区,可以写个小程序测试一下管道的容量Pipe Capacity: /*******...三、如果所有管道读端对应的文件描述符被关闭(管道读端的引用计数等于0),则write操作会产生SIGPIPE信号,默认终止当前进程 示例代码如下: /**************************...四、如果所有管道写端对应的文件描述符被关闭(管道写端的引用计数等于0),那么管道中剩余的数据都被读取后,再次read会返回0 示例程序如下: /*****************************...需要注意的是是边写边读,因为前面说过管道的容量只有64k,当管道被写满时子进程就阻塞等待父进程读取后再写入。...管道的前4种读写规则具有普遍意义,Tcp socket 也具有管道的这些特性。 参考:《APUE》

    3.2K90

    【Linux】IPC 进程间通信(一):管道(匿名管道&命名管道)

    1.3 进程间通信的方式 管道(通过文件系统通信) 匿名管道pipe 命名管道 System V IPC (聚焦在本地通信) System V 消息队列 System V 共享内存 System V...这里也将被打开文件的内核级缓冲区称为 「 管道文件」,而这种由文件系统提供公共资源的进程间通信,就叫做「 管道 」 注意: 此外,管道通信只支持单向通信,即只允许父进程传输数据给子进程,或者子进程传输数据给父进程...命名管道是一种特殊类型的文件(命名管道 -- > mkfifo) 4.2 创建命名管道 Linux系统中,使用 mkfifo 命令创建有名管道文件,再使用两个进程打开即可 $ mkfifo filename...小结 管道是一种用于进程间通信(IPC)的机制,允许一个进程将数据传递给另一个进程。在类Unix操作系统中,管道通常由内核提供,使用简单的读写接口。...管道分为两种类型:无名管道和命名管道 无名管道主要用于具有亲缘关系的进程(如父子进程),在创建时不需要名称,只能通过文件描述符进行访问 命名管道(FIFO)则可以在任何进程之间通信,使用文件系统中的路径来标识

    13810

    Redis 管道

    这涉及到read()和write()的系统调用,因为这需要从用户空间切换到内核空间。上下文切换是一个巨大的速度损失。...当使用管道时,通常使用单个read()系统调用来读取多个命令,使用单个write()系统调用来传递多个回复。...pipelining') do without_pipelining end bench('with pipelining') do with_pipelining end 在我运行Mac OS X系统的环回接口上...原因是系统中的进程并不总是运行,实际上是内核调度器让进程运行。例如,当基准测试被允许运行时,它会从Redis服务器读取回复(与最后执行的命令相关),并写入一个新命令。...现在命令已经在环回接口缓冲区中,但是为了被服务器读取,内核应该调度服务器进程(当前被阻塞在一个系统调用中)运行,等等。所以实际上,由于内核调度器的工作方式,环回接口仍然涉及类似网络的延迟。

    10410

    详解管道

    进程间通信的发展:管道System V进程间通信POSIX进程间通信管道:匿名管道pipe命名管道System V IPC:System V 消息队列System V 共享内存System V 信号量POSIX...IPC:消息队列共享内存信号量互斥量条件变量读写锁二,管道管道是Unix中最古老的进程间通信的形式。...这样通信方式我们叫做匿名管道。管道的本质是一种文件。下面我们来简单的实现一个匿名管道:使用pipe系统调用来创建匿名管道。...因此管道可以让进程间协同,提供了访问控制。管道提供的是面向流式的通信服务,其生命周期随进程。从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。...:命名管道与匿名管道的原理相同,都是通过让两个进程看到同一份资源,从而实现通信,但命名管道不再局限于父子进程之间,而是任意两个进程之间实现通信。

    32451
    领券