Linux下的C语言和系统的缓冲区

server/2024/10/20 19:50:01/

首先来看看这两个代码
1.

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<string.h>void test()
{size_t fd=open("log.txt",O_WRONLY | O_CREAT |O_TRUNC ,0666);dup2(3,1);printf("洁白 闪耀 奇迹 之花");fflush(stdout);close(1);
}int main()
{test();return 0;
}

2.

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<string.h>void test()
{size_t fd=open("log.txt",O_WRONLY | O_CREAT |O_TRUNC ,0666);dup2(3,1);printf("洁白 闪耀 奇迹 之花");//fflush(stdout);close(1);
}int main()
{test();return 0;
}

 其实两个之间的差距就是将fflush注释的区别。
1.


2.

文件缓冲区,和C语言文件的缓冲区

所以我们就能解释上面的现象了,我们将3重定向到一之后,stdout就变成普通文件,刷新的方式就是满刷新,而fflush就是用来刷新文件的缓冲区的,如果不刷新就关闭文件,自然的就不会刷新到文件级缓冲区,所以文件就没有以上的文字。

那我们再这样做呢

 

当然我们程序结束后,会自动刷新文件缓冲区,再将文件关闭。

我们将以下文件重定向文件

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<string.h>void test2()
{//C语言接口printf("hello printf\n");fprintf(stdout,"hello fprintf\n");const char*fw="hello fwrite\n";fwrite(fw,1,strlen(fw),stdout);//系统调用const char*w="hello write\n";write(1,w,strlen(w));fork();
}int main()
{test2();return 0;
}

我们发现如果我们正常运行则都会打印一次,但是当我们重定向到文件里边就会除了系统调用之外都会有两份。因为如果我们不重定向,则1是stdout,刷新方式是行刷新,遇到\n就刷新走了,fork后写实拷贝后也不会再有内容。重定向之后就变成了普通文件,刷新方式变成满刷新,当fork后,子进程也有一份没有刷新走的buff,所以有两份,但是write是系统调用,直接是刷新到内核级缓冲区,子进程的buff是不会再有write的。


http://www.ppmy.cn/server/133432.html

相关文章

低代码框架参考

企业管理信息系统作为一类重要的应用软件系统&#xff0c;具有自己的特点&#xff0c;主要有两个方面&#xff1a; 1. 系统规模大&#xff0c;目前市场上常见的ERP系统一般都有几千个页面。 2. 页面逻辑相似性强。经过比较可以发现&#xff0c;大部分页面具有类似的功能&…

项目模块化下的maven管理工具的使用

开门见山--情境导入 见如下项目的架构&#xff0c;如图&#xff0c;我们可以看到在当前的项目目录中&#xff0c;有两个项目&#xff0c;一个是模块是实现逻辑类的功能 xf-common, 另外一个模块是现实业务逻辑功能 xf-file-manager 但是在这里我们主要用这个模块来测试模拟真…

机器学习【金融风险与风口评估及其应用】

机器学习【金融风险与风口评估及其应用】 一、机器学习在金融风险评估中的应用1.提升评估准确性2.实现自动化和智能化3.增强风险管理能力4.信用评估5.风险模型6.交易策略7.欺诈检测 二、机器学习在金融风口评估中的应用1.识别市场趋势2.评估创新潜力3.优化投资策略4. 自然语言处…

使用Python实现深度学习模型:智能生产线优化

在现代工业中,智能化和自动化生产线已成为提升生产效率和降低成本的关键手段。通过使用深度学习模型,可以实现对生产线的智能优化,从而进一步提高生产线的自动化水平和生产效率。本文将介绍如何使用Python实现深度学习模型,用于智能生产线优化。 一、深度学习在智能生产线…

git分支模型

定义分支 长期分支 指长期存在的分支&#xff0c;也叫固定分支 developmaster 短期分支 短分支没有固定的分支名。但是有分支名规范 feature分支hotfix分支 分支模型 暂时无法在文档外展示此内容 参考 分支的目的是隔离&#xff0c;但多一个分支也意味着维护成本的增加。…

package.json 里的 dependencies和devDependencies区别

dependencies&#xff08;依赖的意思&#xff09;&#xff1a; 通过 --save 安装&#xff0c;是需要发布到生产环境的。 比如项目中使用react&#xff0c;那么没有这个包的依赖就会报错&#xff0c;因此把依赖写入dependencies npm install <package-name>// 缩写 np…

软件工程的学习之详细绪论

软件的定义 软件是程序和所有使程序正确运行所需要的相关文档和配置信息。 Software Program Data Document 一、软件危机&#xff1a; 软件开发和维护过程中遇到的一系列严重问题。 二、具体表现&#xff1a; 1、产品不符合用户的实际需要&#xff1b; 2、软件开发生产率…

linux环境下C程序的编译过程以及makefile的简单使用

在windows下&#xff0c;很多用来进行编程软件对于写好的文件&#xff0c;点击编译即可生成想要文件。如.exe可执行文件&#xff0c;.hex文件或者.bin文件等等。软件为我们省略了很多事。但是对于linux初学者来说&#xff0c;初次接触linux系统&#xff0c;面对命令行黑框框有点…