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

进程通信(一)无名管道和有名管道

为了协调双方的通信,管道机制必须提供一下三个方面的协调能力:互斥、同步和确定对方存在。 下面以linux管道为例进行说明。在linux中,管道是一种频繁使用的通信机制。...在LINUX操作下使用 ulimit -p命令可以查看默认管道的大小。...下面举例分析如何使用无名管道在父子进程间进行通信: 前面已经讲过,由于管道是半双工通信,即在某一时=时刻只能单向传输。...2.有名管道 由于无名管道的局限性,仅限于有血缘关系的进程间通信,所以当需要在不同进程(无血缘关系的进程)之间通信,pipe就不能被使用了。取而代之是有名管道(fifo)。.../fifob a.txt A,B进程必须同时执行,否则被执行的进程会出现阻塞。且看管道机制中的一条,必须确认对方的从在,否则就会阻塞,等待对方的到来。

1.5K20

Linux: linux 匿名管道

相信很多在linux平台工作的童鞋, 都很熟悉管道符 '|', 通过它, 我们能够很灵活的将几种不同的命令协同起来完成一件任务.就好像下面的命令: echo 123 | awk '{print $0+123..., 那咱们来看下 管道的读写规则吧: 当没有数据可读时 O_NONBLOCK (未设置):read调用阻塞,即进程暂停执行,一直等到有数据来到为止。...当管道满的时候 O_NONBLOCK (未设置): write调用阻塞,直到有进程读走数据 O_NONBLOCK ( 设置 ):调用返回-1,errno值为EAGAIN 如果所有管道写端对应的文件描述符被关闭...,则read返回0 如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。...当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

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

    Linux管道命令

    1 什么是管道命令? 管道命令能够将一个命令的执行结果经过筛选,只保留我们需要的信息。...如,/etc目录下会有大量的文件,如果使用ls很难找到需要的文件,因此可以使用管道命令将ls的结果进行一次筛选,只保留需要的信息。 2 管道 和 数据流重定向 的区别?...管道一词非常生动形象,原始数据经过管道后,管道会将一部分不需要的信息过滤掉,只保留用户所关注的信息。 数据流重定向是指定数据在哪里显示,默认情况下会在屏幕显示,我们可以指定它输出到文件。...3.3.2.2 方式2:命令 | sort [-参数] 使用管道,将前一个命令执行的结果按照指定字段进行排序。...lastfile中,然后数据流将会输出到屏幕上,我们可以在输出前再添加一条管道,只输出数据的第一个字段。

    4.5K70

    匿名管道 Linux

    管道 首先自己要用用户层缓冲区,还得把用户层缓冲区拷贝到管道里,(从键盘里输入数据到用户层缓冲区里面),然后用户层缓冲区通过系统调用(write)写到管道里,然后再通过read系统调用,被对方(读端)读取...2:管道只能单向通信 3:父子进程是会进程协同的,同步与互斥的--保护管道文件的数据安全 4:管道是面向字节流的 5:管道是基于文件的,而文件的生命周期是随进程的 再测试,把子进程sleep去掉,就是让子进程写快一点...,父进程sleep几秒,就是让父进程读慢一点,看有什么现象  管道的四种情况 测试管道大小 把c一直往管道里写,把父进程中休眠50秒 结果差不多64kb 写端退了,测试结果 结果是: 读端正常读,写端关闭...,读端就会读到0,表明读到了文件(pipe)结尾,不会被阻塞 read读取成功会返回读到的字符个数,读到结尾返回0 读到结尾父进程也就可以停止读取了,break后去把僵尸的子进程回收 break到这里...阻塞等待!

    8010

    命名管道Linux

    管道是 毫不相关的进程进程间通信::命名管道 管道 首先自己要用用户层缓冲区,还得把用户层缓冲区拷贝到管道里,(从键盘里输入数据到用户层缓冲区里面),然后用户层缓冲区通过系统调用(write)写到管道里...2号系统调用接口 创建一个管道,p开头就是命名管道,并不会直接刷新到磁盘中,实际是个符号 这样会阻塞 这样会显示出来(先输入左边的,再输入右边的就会显示),左右两边是两个进程 >>追加写入的方式,但空间一直是...客户端,只要用就行  第二个参数就是打开文件为了写入的 用户输入完成以后,就要发送输入的消息到另一端 打开顺序一定 然后打开的顺序就一定了,先打开server,然后再打开另一个cc 先打开服务端,会阻塞在这里...getline 会发现一个问题,客户端退出了,服务端还没退出 客户端退出,会read到0,所以服务端(读端)也要退出  改正 sever端 等待写入方式打开后,自己才会打开文件,向后执行,open阻塞了.../server,然后会阻塞,然后./client,就会打印出,logmessage里的信息 为啥./client之前不打印 因为等待写入方式打开后,自己才会打开文件,向后执行,open阻塞了!

    7010

    linux——管道详解

    管道Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。...使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。...errno=%d",errno); return 1; } Linux 管道阻塞之前一次写操作的大小有限制。...专门为每个管道所使用的内核级缓冲区确切为 4096 字节。 除非阅读器清空管道,否则一次超过 4K 的写操作将被阻塞。 实际上这算不上什么限制,因为读和写操作是在不同的线程中实现的。...Linux 还支持命名管道。对这些数字的早期评论员建议我,为公平起见,应该比较 Linux 的命名管道和 Windows 的命名管道。我写了另一个在 Linux 上使用命名管道的程序。

    3K20

    linux 进程通信-管道(pipe)《Rice linux 学习开发》

    Pipe概述 管道Linux中进程间通信的一种方式,它分为三种:无名管道,标准流管道,有名管道。...1-无名管道:只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程) 它是一个半双工的通信模式,具有固定的读端和写端。... 用pipe()函数创建的管道两端处于一个进程中,由于管道主要用于不同进程间的通信,因此实际应用中没有太大意义。...,而在管道的读写中且有阻塞问题的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK 对于读进程 若管道阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入 若管道是非阻塞打开...github链接:https://github.com/RiceChen/Linux-process-communication.git,记得加个star

    1.7K20

    linux系统编程(3)

    (4)Android系统中增加Binder进程间通信方式 Linux 支持以上所有进程间通信方式 三 管道进程间通信 (1)无名管道 特点: 只能用于具有亲缘关系进程间通信(...具有亲缘关系的进程具有数据拷贝动作(复制父进程创建子进程)) int pipe(int pipefd[2]); 功能:创建一个无名管道 参数: @pipefd  获取操作无名管道的文件描述符...  pipefd[0]:读无名管道 pipefd[1]:写无名管道 返回值: 成功返回0,失败返回-1 (2)管道读写规则  读端存在  ,写管道 ---->只要管道没有满,都可以写入数据到管道...读端不存在,写管道 ---->此时写管道没有意义,操作系统会发送SIGPIPE杀死写管道的进程 写端存在,  读管道 ---->此时管道中读取数据,管道中没有数据,读阻塞 写端不存在,读管道...A进程结束条件:文件没有数据可读 B进程: 读管道,写文件 B进程结束条件:在写端关闭,读端不阻塞,如果管道中没有数据,读管道会返回0

    1K20

    Linux编程(阻塞和非阻塞IO)

    Linux设备驱动中的阻塞和非阻塞I/0,简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式。...非阻塞应用程序通常使用select系统调用查询是否可以对设备进行无阻塞的访问最终会引发设备驱动中 poll 函数执行。...=1); //串口上没有输入则返回,所以循环读取 printf("%c/n",buf); 阻塞操作常常用等待队列来实现,而非阻塞操作用轮询的方式来实现。...非阻塞I/O的操作在应用层通常会用到select()和poll()系统调用查询是否可对设备进行无阻塞访问。select()和poll()系统调用最终会引发设备驱动中的poll()函数被调用。...return mask; } 三、总结 阻塞与非阻塞操作: 定义并初始化等待对列头; 定义并初始化等待队列; 把等待队列添加到等待队列头 设置进程状态(TASK_INTERRUPTIBLE(可以被信号打断

    5.5K20

    Linux进程通信——管道

    这说明如果管道没有数据了,读端在读,默认会直接阻塞当前正在读取的进程,只有管道有数据,操作系统识别到,读端才会去读取数据。 2. 管道是一个固定大小的缓冲区。...写端写满的时候,写端会阻塞,等待读端读取。 如果写端一直写,读端一直读呢?...close(fds[1]);//关闭写端 while(1) { //获取命令码,如果没发送,子进程阻塞...也就是说我们进行关闭父进程的第一个写端的时候,其实还有其他进程指向第一个子进程,也就是说他的返回值不是0,并且依旧阻塞。...因为在open这里阻塞中。需要写端打开才能继续跑。 管道文件必须两端同时打开才会继续运行代码。 第二个 我们读端输出并没有换行,为什么自己换行了呢?

    4K70

    linux阻塞与非阻塞(connect连接超时)

    阻塞connect详情介绍可以参见文章:https://blog.csdn.net/qq_41453285/article/details/89890429 一、非阻塞connect概述 man手册...解析文档,非阻塞connect如何使用: ①当我们将sock设置为非阻塞之后,使用connect去连接服务端,即使服务端开启了,connect系统调用也不会连接成功,connect而是以失败告终,并返回错误...②但是非阻塞connect返回的错误是有讲究的: 如果非阻塞connect返回的错误是EINPROGRESS,代表不是connect系统调用出错了,而是connect可能会在后面才会建立完整地连接(...,进一步来等待非阻塞connect客户端与服务端建立完整地连接,在等待的过程中,如果非阻塞connect建立成功了,客户端的sock_fd就会变成可写的(这个在本人的IO复用文章中介绍过,见下图) ④当非阻塞...在有些系统(比如Linux)上返回-1,而在有些系统上(比如源自伯克利的UNIX)返回0 这些问题没有一个统一的解决办法 三、编码演示案例 #include #include <stdlib.h

    6.4K10

    Linux管道那些事儿

    管道的本质是内核维护了一块缓冲区与管道文件相关联,对管道文件的操作,被内核转换成对这块缓冲区内存的操作。...Linux下创建管道函数: int pipe(int pipefd[2]) 成功调用pipe函数之后,会返回两个打开的文件描述符,一个是管道的读取端描述符pipefd[0],另一个是管道的写入端描述符pipefd...管道没有文件名与之关联,因此程序没有选择,只能通过文件描述符来访问管道,只有那些能看到这两个文件描述符的进程才能够使用管道。如果进程执行了fork操作,那么管道就变成如下所示: ?...单向使用管道,也就是说,如果没有用到管道的进程应该尽早释放管道文件fd,这么做不仅仅是为了让数据的流向更加清晰,也不仅仅是为了节省文件描述符,更重要的原因是:关闭未使用的管道文件描述符对管道的正确使用影响重大...因此在使用管道的过程中要注意写入数据是否能及时消费的问题,一旦管道满了,写入就会被阻塞;对于读取端,要及时地读取,防止管道被写满,造成写入阻塞

    2.7K50

    Linux进程间通信——匿名管道

    Linux进程通信方式: 管道管道(pipe)分为无名管道和有名管道无名管道用于具有亲缘关系进程间的通信,有名管道则可以在任意的进程中间进行通信。 管道通信具有以下的特点: 管道是半双工的。...写入的内容每次都添加到管道缓冲区的末尾,并且每次都是从缓冲区的头部读取数据。 Linux建立无名管道函数是pipe函数。它需要的头文件是#include....函数原型:int pipe(int filedes[2]); 函数功能:pipe建立一个无名管道文件,若成功返回0,否则返回-1.错误原因由errno给出。管道文件的描述符由filedes数组返回。...如果子进程读取到的管道文件为空,那么read()函数将会使得进程阻塞,这时候父进程将会执行,然后完成对管道文件的写入。之后wait()将父进程挂起,子进程完成读取。...同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞

    1.4K10

    Linux管道扩展 — 开始使用命名管道

    2.2 命名管道的封装 首先我们来认识一下创建管道的系统调用: MKFIFO(3) Linux...向缓冲区写入数据 命名管道对于读端而言 , 如果我们打开文件,但是写端还没有,就会阻塞在open调用中,等待写端进入 写入 WriteNamedPipe(const std::string&...注意: 对于读端来说,如果我们打开文件,但是写端还没有进入,那么就会阻塞在open()调用中!直到写端打开—进程同步!!! 当读端退出时,写端再次写入数据时会直接退出!操作系统不会做无用功!!!...会发送对应的13号信号SIGPIPE) 管道别写满 && read fd 不读且没有关闭 : 管道被写满,写进程会被阻塞,写条件不具备-- wait 等待条件具备(读取走一部分数据才能继续写) 如果管道内部是空的...&& write fd没有关闭: 读取条件不具备,读取进程会被阻塞 – wait 等待条件具备(写入了数据) 3回归概念 总结一下,命名管道的通信原理依然是:让两个不同的进程看到同一份资源(通过文件路径

    9410

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

    管道Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。...使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。...) { printf("pipe() FAILED: errno=%d",errno); return 1; } Linux 管道阻塞之前一次写操作的大小有限制...专门为每个管道所使用的内核级缓冲区确切为 4096 字节。除非阅读器清空管道,否则一次超过 4K 的写操作将被阻塞。实际上这算不上什么限制,因为读和写操作是在不同的线程中实现的。...Linux 还支持命名管道。对这些数字的早期评论员建议我,为公平起见,应该比较 Linux 的命名管道和 Windows 的命名管道。我写了另一个在 Linux 上使用命名管道的程序。

    1.2K10

    进程间通信

    IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。...以Linux中的C语言编程为例。 一、管道 管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。 1、特点: 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。...如下图: 二、FIFO FIFO,也称为命名管道,它是一种文件类型。 1、特 FIFO可以在无关的进程之间交换数据,与无名管道不同。...当 open 一个FIFO时,是否设置非阻塞标志(O_NONBLOCK)的区别: 若没有指定O_NONBLOCK(默认),只读 open 要阻塞到某个其他进程为写而打开此 FIFO。...image.png 五种通讯方式总结 1.管道:速度慢,容量有限,只有父子进程能通讯     2.FIFO:任何进程间都能通讯,但速度慢     3.消息队列:容量受到系统限制

    89420

    linux 命名管道实例详解

    linux进程间通信——命名管道 FIFO(命名管道)不同于匿名管道之处在于它提供⼀个路径名与之关联,以FIFO的⽂件形式存储于⽂件系统中。...命名管道是⼀个设备⽂件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。...值得注意的是,FIFO(first input first output)总是按照先进先出的原则⼯作,第⼀个被写⼊的数据将⾸先从管道中读出。 创建命名管道的系统函数有两个:mknod和mkfifo。...:mod为创建的命名管道的模式,指明其存取权限;dev为设备值,该值取决于⽂件创建的种类,它只在创建设备⽂件时才会⽤到。...下⾯使⽤mknod函数创建了⼀个命名管道: umask(0); if (mknod("/tmp/fifo",S_IFIFO | 0666) == -1) { perror("mkfifo error

    4.1K21
    领券