Linux 下管道通信

管道和消息队列本质都差不多,都是linux内核的缓冲区。

管道限制
管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道
只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。管道用的是越来越少了

管道读写规

当没有数据可读时

read调用阻塞,即进程暂停执行,一直等到有数据来到为止。

如果设置了不等待,read调用返回-1,errno值为EAGAIN。

当管道满的时候

write调用阻塞,直到有进程读走数据

如果设置了不等待,调用返回-1,errno值为EAGAIN

当管道不停的被写,写满的时候

write调用阻塞

调用返回-1,errno值为EAGAIN

如果所有管道写端对应的文件描述符被关闭,则read返回

如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE

当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。

当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

管道本质,内核中固定大小的缓冲区。

Shell脚本中的|命令本质上就是用管道技术实现的。

首先 会创建一个管道,然后有几个命令就会创建几个进程

对于执行第一个命令的进程,会关闭进程的读端,然后使用dup2命令,将标管道的写端复制成为标准输出,然后执行exec函数族,这样就相当于是对管道进行了写。对于执行第二个命令的进程,

会关闭写端,然后使用dup2命令,将管道的读端复制成为标准输出,然后执行exec函数组命令,这样第一个命令的输出就相当于是第二个命令的输入,后面多余命令都是类似的。

命名管道

管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。

如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。命名管道是一种特殊类型的文件。

创建一个命名管道

命名管道可以从命令行上创建,命令行方法是使用下面这个命令:mkfifo filename

命名管道也可以从程序里创建,相关函数有: int mkfifo(const char *filename,mode_t );

原文地址:https://www.cnblogs.com/randyniu/p/9180627.html

时间: 2024-11-13 06:47:02

Linux 下管道通信的相关文章

linux下串口通信与管理

linux下的串口与windows有一些区别,下面将介绍一下linux下串口通信管理 查看是否支持USB串口: #lsmod | grep usbserial 如果没有信息:sudo apt-get install setserial 插上USB转串口,在终端输入命令 #dmesg | grep ttyUSB0 如果出现连接成功信息,则说明系统已经识别该设备 一.找到自己的串口设备 查找自己的开发板与电脑的连接的COM口方法 Windows:设备管理器 linux: (1)dmesg #查看带有

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

管道(PIPE) 管道的运行原理 管道是一种最基本的IPC机制,由pipe函数创建: #include<unistd.h> int pipe(int filedes[2]); 调用pipe函数时在内核中开辟一块缓冲区用于通信,它有一个读端和一个写端,通过filedes参数传出给程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端.管道就像一个打开的文件,通过read(filedes[0]);或者write(filedes[1]):向这个文件读写数据,其实是

Linux下串口通信工具minicom

minicom是linux下的串口通信工具,类似于Windows下的超级终端. 一般在yum源中可以直接安装 minicom -s可以设置minicom的速率,流控之类. 如上图:A是你的设备名.如在台式机上用console接串口则一般为/dev/ttyS0, 如果笔记本上使用USB-串口转换则为/dev/ttyUSB0之类. Linux下一般均默认安装了USB-串口的驱动 将配置保存为默认(Save setup as dfl),下次输入minicom则可以启动 注意:非正常关闭minicom,

Linux下进程通信之管道

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication).如下图所示. 目前进程通信的方式有: 管道 FIFO 消息队列 信号量 共享内存 套接字 管道 管道概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数

linux下IPC通信

# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. # 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信. # 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手段. # 消息队列

Linux下的通信时延测试程序

今天段老师在网络软件设计课上布置了一个题目. 要求是windows环境,现在在linux环境下实现. 运行C/S模式的2个程序,使用UDP协议,发送10次,计算平均时延. 服务器程序如下: #include <sys/socket.h> // for functions for socket #include <netinet/in.h> // for struct sockaddr_in #include <stdlib.h> #include <memory.

Linux下管道编程

功能: 父进程创建一个子进程父进程负责读用户终端输入,并写入管道 子进程从管道接收字符流写入另一个文件 代码: #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <fcntl.h> #define MAX 10

linux下管道及重定向

系统默认设定: 标准输入:STDOUT,0 标准输出: STDIN,1 标准错误输出: STDERR,2 2.I/O重定向: >:覆盖输出 set -C :禁止对已经存在的文件覆盖重定向 如需强制覆盖输出重定向:可使用 >| set +C :启用对已经存在的文件覆盖重定向 >>:追加输出 2> :  标准错误输出 2>> :标准错误追加方式 &> : 标准或错误输出至同一文件 举例说明:ls /etc/ &> /tmp/err.txt

Linux下串口通信工具minicom的用法

一.查看串口设备 例如,将USB转串口线插入交换机Console口后,执行命令:$ll /dev/ttyUSB* 二.连接串口设备 $sudo minicom -D /dev/ttyUSB0 三.设置串口参数 在minicom中按CTRL+A,O,配置串口速率9600,8位,无奇偶校验,保存 四.查看minicom配置文件 [email protected]:~$ cat .minirc# Machine-generated file - use setup menu in minicom to