文件读写的细节
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再根据硬盘的特性选择最好的时机写入硬盘)。
上一篇: MySQL之SQL优化详解(二)
下一篇: 百度无偿献血小程序上线:即搜即用