欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

文件读写的细节

程序员文章站 2024-01-23 18:38:40
...

1.errno和perror
(1)errno就是error number 就是错误号码,linux中对各种错误进做了编号,当函数执行错误时函数会返回一个errno特定的编号来告诉我们函数哪里错了。
(2)errno是操作系统维护的一个全局变量,任何OS内部函数都可以通过设置errno来告诉上层应用者发生了什么错误。
(3)errno本身是一个int型数字,每个数字对应一种错误,不适用于操作者看,于是提供了一个函数perror(printf error),这个函数会从内部读取errno的数字,并直接转成对应的字符串信息打印出来。

void perror(const char *s);
打印结果为这个传入的字符串+错误信息

2.read和write的count问题

ssize_t write(int fd, const void *buf, size_t count);

(1)count 是我们想要读或写的字节数,但实际的返回值是我们真正读取和写入的字节数。
(2)count和阻塞和非阻塞结合起来,如果一个函数是非阻塞式的,我们要读取30个,结果暂时只有20个时就会被阻塞,等待剩余的10个被读,返回一个20.

3.文件IO效率和标准IO
(1)文件IO就是指当前讲的open,read,等API等函数构成等函数构成的一套读写文件的体系。这套体系能很好的完成文件读写,但是效率不高。
(2)应用层C语言函数库提供了一套用来做文件读写函数的库函数,叫标准IO。也是由C库函数构成的(fopen,fclose等)这些标准IO实质是由文件IO封装而成的(fopen调用的还是open)。标准IO加了封装之后主要是为了在应用层添加一个缓冲机制,这样我们通过fwrite写入内容就不是直接写入内核buf中,而是进入应用层标准IO库自己维护的buf中,然后标准IO库自己根据操作系统write的最佳count来选择最好的时机来完成write到内核中的buf(内核中的buf再根据硬盘的特性选择最好的时机写入硬盘)。