IO con búfer y IO sin búfer

  Hay dos conjuntos de funciones en las operaciones de archivos, uno es fopen () y fread () en la biblioteca C , y el otro es el sistema Linux llama open () y read () ...
  Aunque todos implementan operaciones de archivo, uno de ellos Todavía hay algunas diferencias entre. Quizás encontremos en Internet: fopen () , fread () … son llamadas del sistema búfer, open () , read () … son llamadas del sistema no búfer. Entonces se almacena en búfer al final, ¿qué significa?


Primero el código:

(1) llamada a la función de biblioteca C

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    
    
	char buf; //建立缓冲区
	FILE* source, * backup; //设立FILE结构指针
	if ((source = fopen("file.txt", "r")) == NULL) //若以只读形式source.dat成功打开,则fopen()返回FILE指针source
	{
    
    
		printf("Error in opening file.\n");
		exit(1);
	}
	if ((backup = fopen("backup_c.txt", "w")) == NULL) //若以只写形式backup.dat无法打开,则创建文件不成功
	{
    
    
		printf("Error in creating file.\n");
		exit(1);
	}

	int flag=1; //判断是否备份成功
	while (fread(&buf, sizeof(buf), 1, source) == 1) //用fread函数读取source的一个buf大小的数据到缓冲区
	{
    
    
		if (fwrite(&buf, sizeof(buf), 1, backup) == 0) //用fwrite函数把一个buf大小的缓冲区数据写入backup
		{
    
    //若写入错误,则打印“写入文件错误”
			flag=0;
			printf("Error in wrinting file.\n");
			exit(1);
		}
	}
	if(flag) 
		printf("备份完成!");
	if (ferror(source)) //读取文件source出现错误 
	{
    
    
		printf("Error in reading file.\n");
		exit(1);
	}
	if (fclose(source)) //source流的关闭出现错误
	{
    
    
		printf("Error in close file.\n");
		exit(1);
	}
	if (fclose(backup)) //backup流的关闭出现错误
	{
    
    
		printf("Error in close file.\n");
		exit(1);
	}
	return 0;
}

(1) llamada al sistema Linux

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(){
    
    
    //打开文件
    int src = open("file.txt",O_RDONLY);//以只读形式打开test文件,返回一个文件描述符
    int dest = open("backup_linux.txt",O_RDWR|O_CREAT,0644);//读写方式打开,644是权限

    //读取test内容,写入copy_test
    char buf[2];//定义字符缓冲数组,用于存放读取到的文件内容
    int read_size,write_size = 0;
    while((read_size = read(src,buf,1))!= 0)//返回0说明读取完毕
    {
    
    
        write_size += write(dest,buf,read_size);
    }
    printf("写入文件内容大小为:%d\n",write_size);

    //关闭文件
    close(src);
    close(dest);
    return 0;
}

  En las dos piezas de código anteriores, encontramos que en realidad necesitan algo llamado búfer para almacenar temporalmente el contenido del archivo.

C库函数调用.c

char buf; //建立缓冲区
linux系统调用.c

char buf[2];//定义字符缓冲数组,用于存放读取到的文件内容

Sin embargo, este búfer no es el otro búfer. El "búfer" en el "sistema de búfer" y el "sistema sin búfer" es diferente del "búfer" en el código anterior.

  El llamado sistema sin búfer significa que la capa de usuario no tiene caché y lee y escribe archivos de disco directamente a través de llamadas al sistema, pero para el kernel, todavía se almacena en caché. El kernel ahora escribe los datos en la memoria búfer del kernel y cuando la memoria búfer se desborda Para las operaciones de E / S reales, el sistema de búfer se refiere al establecimiento de un búfer de flujo a nivel de usuario, las funciones de biblioteca leen y escriben datos en el búfer de flujo y las llamadas al sistema se realizan cuando el búfer de flujo se desborda, es decir, se vuelve a llamar a E / S sin búfer.



La diferencia entre las dos series de funciones:

Cotización: la diferencia entre las funciones
IO con búfer y IO sin búfer,
abrir / leer / escribir y fopen / fread / fwrite

Supongo que te gusta

Origin blog.csdn.net/weixin_43655282/article/details/106741077
Recomendado
Clasificación