linuxC语言缓冲区及小程序的实现

文章目录

1.文件缓冲区

1.1介绍

为缓和 CPU 与 I/O 设备之间速度不匹配,文件缓冲区用以暂时存放读写期间的文件数据而在内存区预留的一定空间。使用文件缓冲区可减少读取硬盘的次数。

1.2缓冲文件系统

系统自动地在内存为程序中每一个正在使用的文件开辟一块文件缓冲区。

  • 从内存向磁盘输出数据,先送到内存中的缓冲区,缓冲区装满后一起输送到磁盘上。
  • 从磁盘向计算机读入数据,从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),从缓冲区逐个地将数据送到程序数据区(程序变量等)。
  • 缓冲区的大小根据C编译系统决定。

1.3冲刷函数fflush

c 复制代码
int fflush( FILE *stream );
将缓冲区内数据写到stream 指定文件。
成功返回 0 
错误返回 EOF 
高版本vs无法使用
fclose关闭文件时也会刷新缓冲区

#include <stdio.h>
#include <windows.h>
int main() 
{
	FILE* pf = fopen("test7.txt", "w");
	if (!pf)
	{
		perror(fopen);
		return 1;
	}
	fputs("abcdef", pf); //数据输出到buffer
	                     //此时文件中无内容
	Sleep(10000);        //睡眠10s
	fflush(pf);          //刷新缓冲区
	Sleep(10000);        //睡眠10s
	                     //此时数据到达文件
	fclose(pf);
	pf = NULL;
    return 0;
}

1.4认识linux下的缓冲区

在linux下gcc编译这两段代码时 结果是不同的 左边先输出后睡眠 右边先睡眠后输出

c语言不是从上到下一行一行执行的吗?

确实是的 实际上printf先于sleep执行但是sleep执行完后这个程序才结束 才会输出信息

为什么执行流到printf时 不直接显示以及为什么左边加了换行就能先显示?

c语言存在输出缓冲区(一段内存空间) 显示器设备一般的刷新策略是行刷新 即碰到\n就把\n之前的所有的字符显示出来 所以左边代码先显示 后边代码存入到缓冲区 直到程序结束才显示

当一个程序执行会自动打开stdin srdout stderr三个标准IO流

如何在没有换行符的情况下让他执行到printf时就显示?

c 复制代码
#include <stdio.h>
#include<unistd.h>
int main()
{
	printf("hello linux!");
	fflush(stdout);
	sleep(3);
	return 0
}

2.linux小程序的实现

2.1 回车\r和换行\n

老式键盘的Enter: 实际上是 换行+回车[C语言中的\n也是]

c 复制代码
#include <stdio.h>
#include<unistd.h>
int main()
{
	int count = 5;
	while(count)
	{
		printf("count是: %d\n",count);
		count--;
		sleep(1);
		return 0;
	}
}

可以正常输出

c 复制代码
#include <stdio.h>
#include<unistd.h>
int main()
{
	int count = 5;
	while(count)
	{
		printf("count是: %d\r",count);
		count--;
		sleep(1);
		return 0;
	}
}

不输出任何内容

2.2倒计时程序

c 复制代码
#include <stdio.h>
#include<unistd.h>
int main()
{
	int count = 5;
	while(count)
	{
		printf("count是: %d\r",count);
		fflush(stdout);
		count--;
		sleep(1);
		return 0;
	}
}

每执行一次printf 将要输出的信息输出到缓冲区 当执行fflush函数时 将信息从缓冲区刷到显示器 之后\r回车 光标回到行首 count--

2.3进度条小程序

sleep/usleep

代码

运行结果

linu-vim-c-bar

相关推荐
sinat_384241091 小时前
使用 npm 安装 Electron 作为开发依赖
服务器
朝九晚五ฺ1 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream1 小时前
Linux的桌面
linux
xiaozhiwise2 小时前
Makefile 之 自动化变量
linux
Kkooe2 小时前
GitLab|数据迁移
运维·服务器·git
久醉不在酒3 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
意疏4 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
虚拟网络工程师4 小时前
【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
运维·服务器·网络·数据库·mariadb
BLEACH-heiqiyihu4 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器