linux--有名管道

有名管道: 在文件目录树中有一个文件标示(管道文件)。 实际不占据磁盘空间。数据缓存在内存上。


阻塞运行函数: 函数调用以后并不会立即返回, 需要等待某些条件的发生才会返回。


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前的单词个数




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值