FIFO测试

#include <stdio.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define FIFONAME "./fifo"
#define BUFFERSIZE 1000
#define MAXSIZE 1000
int writefifo()
{
	int fd;
	int ret;
	char buffer[BUFFERSIZE];
	
	ret = access(FIFONAME,F_OK);
	if(ret<0){
		ret = mkfifo(FIFONAME,0777);
		if(ret<0){
			printf("could not create fifo %s\n",FIFONAME);
			return -1;
		}
	}
	
	fd = open(FIFONAME,O_WRONLY);
	if(fd<0){
		printf("open error\n");
		return -1;
	}
	
	//make the buffer data
	int i;
	for(i=0;i<BUFFERSIZE;i++){
		buffer[i] = 1;
	}
	
	int wrlen = 0;
	int cnt = 0;
	while(wrlen < MAXSIZE){
		ret = write(fd, buffer, 10);
		printf("loop %d, write %d data:\n",++cnt,ret);
		for(i=0;i<ret;i++){
			printf("%0x  ",buffer[i]);
		}
		printf("\n");
		
		sleep(1);
		wrlen += ret;
	}
	
	close(fd);
	
	return 0;
}

int readfifo()
{
	int fd;
	int ret;
	int rdlen = 0;
	char buffer[BUFFERSIZE];
	
	ret = access(FIFONAME,F_OK);
	if(ret<0){
		ret = mkfifo(FIFONAME,0777);
		if(ret<0){
			printf("[readfifo] could not creat fifo\n");
			return -1;
		}
	}
	fd = open(FIFONAME,O_RDONLY);
	if(fd<0){
		printf("open error\n");
		return -1;
	}
	
	int i;
	int cnt=0;
	while(rdlen<MAXSIZE){
		ret = read(fd,buffer,10);
		printf("loop %d,read %d data\n",++cnt,ret);
		for(i=0;i<ret;i++){
			printf("%0x  ",buffer[i]);
		}
		printf("\n");
		sleep(1);
		rdlen += ret;
	}
	
	close(fd);
	return 0;
}


int main(int argc,char *argv[])
{
	if(argv[1][0]=='r'){
		readfifo();
	}else if(argv[1][0]=='w'){
		writefifo();
	}
	return 0;	
}

read未打开fd,write写

write阻塞

[bxt@localhost fifo]$ ./a.out w

write未打开fd,read读

read阻塞

write每次写20,read每次读10

write和read同频率。

ret = write(fd, buffer, 20);
ret = read(fd,buffer,10);

write循环写10次,read需要循环读20次。

write每次写10,read每次读20

write和read同频率

ret = write(fd, buffer, 10);
ret = read(fd,buffer,20);

write每次写10,read每次也只读到0.

write高频写,read低频读

while(wrlen < MAXSIZE){
		ret = write(fd, buffer, 10);
		printf("loop %d, write %d data:\n",++cnt,ret);
		for(i=0;i<ret;i++){
			printf("%0x  ",buffer[i]);
		}
		printf("\n");
		
		sleep(1);
		wrlen += ret;
	}
while(rdlen<MAXSIZE){
		ret = read(fd,buffer,10);
		printf("loop %d,read %d data\n",++cnt,ret);
		for(i=0;i<ret;i++){
			printf("%0x  ",buffer[i]);
		}
		printf("\n");
		sleep(2);
		rdlen += ret;
	}

read花两倍时间将写入的数据读完。

低频写,高频读

while(wrlen < MAXSIZE){
		ret = write(fd, buffer, 10);
		printf("loop %d, write %d data:\n",++cnt,ret);
		for(i=0;i<ret;i++){
			printf("%0x  ",buffer[i]);
		}
		printf("\n");
		
		sleep(2);
		wrlen += ret;
	}
while(rdlen<MAXSIZE){
		ret = read(fd,buffer,10);
		printf("loop %d,read %d data\n",++cnt,ret);
		for(i=0;i<ret;i++){
			printf("%0x  ",buffer[i]);
		}
		printf("\n");
		sleep(1);
		rdlen += ret;
	}

read将fifo读空后,阻塞在read,结果跟write同频。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值