C标准函数与系统函数--文件I/O

这篇博客探讨了C标准文件IO的工作原理,它依赖于操作系统提供的API接口,如write,来实现文件操作。C标准库的FILE结构体包含了文件描述符、读写指针和缓冲区,缓冲区提高了IO效率。当程序结束或缓冲区满时,数据会被刷新。Linux系统API提供无缓冲或低级缓冲的IO,允许更直接地控制硬件。学习Linux API能更好地理解和利用系统资源。

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

1.C标准文件IO工作位置:

理论上可在任何操作系统上运行,工作在操作系统之上

2.工作原理:

例如:printf先去调系统函数write,再去调内核中的函数,再去调驱动层

C标准库并不知道如何操作当前显示设备

它是通过操作系统,操作系统提供了应用层的API接口write。

应用层API自动向下调内核层API,内核层API知道如何操作显示设备

这就是为什么windows下的.exe放到linux下不能正常运行,因为没有相应的系统函数

需要把源代码在linux下重新编译。

 

 

 

APUE主要学习Linux(UNIX)应用层API

3.为什么要学习Linux系统API?

因为它和操作系统结合得更紧密,能做的事更强大。

更为重要的一点,在了解该概念之前,先回忆概念

(1)FILE结构体

C标准库三个流STDIN、STDOUT、STDERROR,

文件类型FILE*文件指针结构体的核心内容:

(1)文件描述符inode指向磁盘当中的真正的文件

(2)f_pos读写指针的位置,当操作一个文件读写到文件的哪个位置.

(3)buffer缓冲区指针,指向一个缓冲区,大小8192字节

当打开一个文件都会得到一个FILE结构体。

当对文件进行读写操作时,读写的是磁盘文件,通过文件描述符找到文件在磁盘上的位置,

读写数据时,不会直接往磁盘上写,而是先写到缓冲区。可以减少IO,提高效率。

C标准库为每个文件流指针创建一个缓冲区

标准输入、标准输出、标准出错分别对应三个缓冲区

(2)如何刷新缓冲区?

程序正常退出

缓冲区满了自动刷新

刷新缓冲区flush

\n刷新终端文件STDIN、STDOUT、STDERROR

 所以第二个原因:

 C标准文件都是都是携带了缓冲区的,

而缓冲区也是有利有弊的,网络IO等等我们不需要缓冲区

Linux提供的API没有缓冲区 (或者说但在write的底层也可以分配一个内核I/O缓冲区)

Unbuffered I/O这个名词是有些误导的,虽然write系统调用位于C标准库I/O缓
冲区的底层,但在write的底层也可以分配一个内核I/O缓冲区,所以write也不一定是直接
写到文件的,也可能写到内核I/O缓冲区中,至于究竟写到了文件中还是内核缓冲区中对于
进程来说是没有差别的,如果进程A和进程B打开同一文件,进程A写到内核I/O缓冲区中的数
据从进程B也能读到,而C标准库的I/O缓冲区则不具有这一特性

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值