Linux下通过FIFO传输大文件(test.264)

本文演示了在Linux环境下创建管道并实现文件复制的方法,包括使用系统调用和自定义函数来读取和写入文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.linux下同目录下新建管道:
mkfifo fifo1 0666

2.同目录下放入test.264文件,新建copy.264文件(记得给权限)

fifo_write.c

#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
#define BUFES 1024

int fd ,fd1;
int n, i ,readlen;
char buf[BUFES];

int main(void)
{
printf("BUFFS is :%d\n",PIPE_BUF);
if((fd=open("fifo1",O_WRONLY))<0){ 
perror("open fifo1");
exit(1);
}
if((fd1=open("test.264",O_RDONLY))<0){
	perror("open test.264");
	exit(1);
}
printf("before while\n");

while((readlen=readTobuf(fd1,buf,BUFES))>0){
	printf("readTobuf size--->%d\n",readlen);
	readlen=0;
	my_write(fd,buf,BUFES);
}
	printf("****end****\n");
	close(fd);
	exit(0);
}
int my_write(int fd,void *buffer,int length)  
{  
int bytes_left;  
int written_bytes; 
 char *ptr;  
 ptr=buffer;  
bytes_left=length; 
 while(bytes_left>0)  
 {  
         written_bytes=write(fd,ptr,bytes_left);          
		 if(written_bytes<=0)           
		 {         
          if(errno==EINTR) /* 中断错误*/                         
				written_bytes=0;  
                 else             /* 其他错误 没有办法,只好撤退了*/                          
				 return(-1);           
		  }  
         bytes_left-=written_bytes;  
         ptr+=written_bytes;     /* 从剩下的地方继续写   */ 
 }  
return(0);  
}

int readTobuf(int fd,void *buffer,int length)  
{  
int bytes_left;  
int bytes_read;  
char *ptr;   
ptr=buffer;   
bytes_left=length;  
while(bytes_left>0)  
{  
    bytes_read=read(fd,ptr,bytes_left);      
	if(bytes_read<0)      
	{  
      if(errno==EINTR)           
	  bytes_read=0;        
	  else  
         return(-1);     
      }  
    else if(bytes_read==0)          
	break;  
     bytes_left-=bytes_read;       
	 ptr+=bytes_read;  
	 }  
return(length-bytes_left);  
} 

fifo_read.c

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#define BUFES 1024

int fd;
int fd1;
int readlen;
char buf[BUFES];

int main(void)
{
int sum=0;
int i;
if((fd=open("fifo1",O_RDONLY))<0) 
{
perror("open fifo1");
exit(1);
}
if((fd1=open("copy.264",O_WRONLY))<0) 
{
perror("open copy.264");
exit(1);
}

while((readlen=my_read(fd,buf,BUFES))>0){
	printf("my_read size--->%d\n",readlen);
	readlen=0;
	writeTo264(fd1,buf,BUFES);
}

printf("*****end******\n");
close(fd); 
exit(0);

}

int my_read(int fd,void *buffer,int length)  
{  
int bytes_left;  
int bytes_read;  
char *ptr;   
ptr=buffer;   
bytes_left=length;  
while(bytes_left>0)  
{  
    bytes_read=read(fd,ptr,bytes_left);      
	if(bytes_read<0)      
	{  
      if(errno==EINTR)           
	  bytes_read=0;        
	  else  
         return(-1);     
      }  
    else if(bytes_read==0)          
	break;  
     bytes_left-=bytes_read;       
	 ptr+=bytes_read;  
	 }  
return(length-bytes_left);  
} 

int writeTo264(int fd,void *buffer,int length)  
{  
int bytes_left;  
int written_bytes; 
 char *ptr;  
 ptr=buffer;  
bytes_left=length; 
 while(bytes_left>0)  
 {  
         written_bytes=write(fd,ptr,bytes_left);          
		 if(written_bytes<=0)           
		 {         
          if(errno==EINTR) /* 中断错误*/                         
				written_bytes=0;  
                 else                                     
				 return(-1);           
		  }  
         bytes_left-=written_bytes;  
         ptr+=written_bytes;     
 }  
return(0);  
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值