基础文件输入输出操作详解
1. read 系统调用
read 系统调用用于从文件描述符中读取数据,其函数原型如下:
#include <unistd.h>
ssize_t read(
int fd, /* 文件描述符 */
void *buf, /* 接收数据的地址 */
size_t nbytes /* 要读取的字节数 */
);
/* 返回读取的字节数,文件结束返回 0,出错返回 -1 并设置 errno */
它与 write 系统调用相反,从由 fd 表示的打开文件中读取 nbytes 字节到 buf 指向的地址。读取从文件偏移量的当前位置开始,然后文件偏移量会增加读取的字节数。read 不受 O_APPEND 标志的影响。
与 write 不同,read 系统调用不能先传递数据再稍后读取。如果数据不在缓冲区缓存中,进程必须等待内核从磁盘获取数据。有时,内核会通过提前读取来加速顺序读取。
当进行部分读取时,由于短计数不是错误,errno 无效,需要猜测问题所在。如果需要读取全部数据,最好在循环中调用 read,例如 readall 函数:
ssize_t readall(int fd, void *buf, size_t nbyte)
{
ssize_t nread = 0, n;
do {
if ((n = read(fd, &((char *)buf)[nread], nbyte -
超级会员免费看
订阅专栏 解锁全文
3万+

被折叠的 条评论
为什么被折叠?



