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

相关推荐
YXXY3131 小时前
线程的介绍(四)
linux
李白你好1 小时前
AI Agent 架构的自动化渗透测试工具
运维·人工智能·自动化
Snasph2 小时前
GNU Make 用户手册(中文版)
服务器·算法·gnu
广州灵眸科技有限公司2 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) Easy-Eai编译环境准备与更新
服务器·前端·人工智能·python·深度学习
一勺菠萝丶2 小时前
Docker Desktop 启动后容器自动启动怎么办?如何关闭容器自启动
运维·docker·容器
Esaka_Forever2 小时前
uv init 完整用法(Python 最快包管理器)
服务器·python·uv
溜达的大象3 小时前
服务器挂了等用户报障?我用Prometheus搭了一套监控告警,服务器出状况第一时间通知我
服务器·php·prometheus
ylscode3 小时前
Comodo防火墙曝致命零日漏洞:单个IPv6数据包即可触发Windows蓝屏死机
运维·网络·windows·安全·安全威胁分析
kTR2hD1qb3 小时前
从 Responses API 到 Chat Completions:一个模型网关的设计复盘
linux·前端
实在智能RPA3 小时前
药企GMP合规自动化破局:实在Agent的功能完整度评估与落地实践
运维·人工智能·ai·自动化