有名管道: 在文件目录树中有一个文件标示(管道文件)。 实际不占据磁盘空间。数据缓存在内存上。
阻塞运行函数: 函数调用以后并不会立即返回, 需要等待某些条件的发生才会返回。
open操作管道文件时, 阻塞运行的函数。
如果一个进程以只写方式打开一个管道文件,open会阻塞运行, 直到有一个进程以读方式打开管道文件。open才会返回, 进程才会接着执行。
如果一个进程以只读方式打开一个管道文件, open会阻塞运行, 直到有一个进程以写方式打开管道文件。open才会返回, 进程才会接着执行。
read函数也会阻塞运行, 直到写端写入数据或者所有的写端都关闭。
read读取数据并且会将内存上的已读数据清空。
管道:
所谓单工通信:是指消息只能单方向传输的工作方式。例如遥控、遥测(一部分),就是单工通信方式。
单工通信信道是单向信道,发送端和接收端的身份是固定的,发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息,数据信号仅从一端传送到另一端,即信息流是单方向的。
通信双方采用“按——讲”(Push To Talk,PTT)单工通信属于点到点的通信。根据收发频率的异同,单工通信可分为同频通信和异频通信。
半双工通讯是指数据可以沿两个方向传送,但同一时刻一个信道只允许单方向传送,因此又被称为双向交替通信。(信息在两点之间能够在两个方向上进行发送,但不能同时发送的工作方式。)
半双工方式要求收发两端都有发送装置和接收装置。由于这种方式要频繁变换信道方向,故效率低,但可以节约传输线路。半双工方式适用于终端与终端之间的会话式通信。方向的转变由软件控制的电子开关来控制的。
例如:无线对讲机就是一种半双工设备,在同一时间内只允许一方讲话。
全双工通讯全双工是指在通信的任意时刻,线路上可以同时存在A到B和B到A的双向信号传输。在全双工方式下,通信系统的每一端都设置了发送器和接收器,因此,能控制数据同时在两个方向上传送。全双工方式无需进行方向的切换,因此,没有切换操作所产生的时间延迟,这对那些不能有时间延误的交互式应用(例如远程监测和控制系统)十分有利。
管道原理: (如下图)
管道练习如下
A 进程负责循环接受用户输入的数据, 以”end”为结束标志, B 进程负责统计用户输入的单词个数。 显示到界面上。
先通过mkfifo FIFO建立有名管道FIFO
代码如下
maina.c
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<ctype.h>
#include<fcntl.h>
int main()
{
int fd=open("FIFO",O_WRONLY);
assert(fd != -1);
printf("please input:");
// fflush(stdout);
char buff[128]={0};
fgets(buff,128,stdin);
while(strncmp(buff,"end",3)!=0)
{
write(fd,buff,strlen(buff)-1);
memset(buff,0,128);
fgets(buff,128,stdin);
}
printf("end\n");
close(fd);
}
mainb.c
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<fcntl.h>
#include<ctype.h>
void main()
{
int fd = open("FIFO",O_RDONLY);
if(fd ==-1)
{
exit(0);
}
printf("inout:");
int count=0;
char buff[128]={0};
while(read(fd,buff,127)>0)
{
printf("%s\n",buff);
count++;
}
printf("%d\n",count);
}
运行时打开两个terminal一边运行maina一边运行mainbmainb运行好以后maina会出现input 在maina中输入什么mainb中就会输出什么最后end时mainb会统计maina中end前的单词个数