read
是Linux系统中用于从打开的文件、管道或者终端中读取数据的系统调用。它将数据从文件描述符指向的文件中读取到缓冲区中。
函数原型
read
函数的原型定义在unistd.h
头文件中,如下所示:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
fd
:文件描述符,指定从哪个打开的文件中读取数据。这个文件描述符是通过open
、socket
、accept
等系统调用获得的。buf
:指向缓冲区的指针,用于存储从文件中读取的数据。count
:指定最大读取的字节数。
返回值
- 当读取成功时,
read
返回实际读取到的字节数。 - 如果到达文件末尾,则返回
0
。 - 出错时,返回
-1
,并设置errno
以指示错误类型。
示例
下面是一个使用read
函数从文件中读取数据的简单示例:
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define TARGET_BYTES 1024 // 假设我们想要读取的目标字节数
int main() {
int fd;
ssize_t bytesRead, totalBytesRead = 0;
char buffer[TARGET_BYTES];
// 打开文件
fd = open("/path/to/file.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return EXIT_FAILURE;
}
// 循环读取数据,直到读取到目标字节数或遇到文件末尾
while (totalBytesRead < TARGET_BYTES) {
bytesRead = read(fd, buffer + totalBytesRead, TARGET_BYTES - totalBytesRead);
if (bytesRead == -1) {
perror("Error reading file");
close(fd);
return EXIT_FAILURE;
} else if (bytesRead == 0) {
// 到达文件末尾
break;
}
totalBytesRead += bytesRead;
}
printf("Total read %zd bytes.\n", totalBytesRead);
// 处理读取到的数据
// 关闭文件
close(fd);
return EXIT_SUCCESS;
}
在这个示例中,首先使用open
函数以只读模式打开一个文件,并获得文件描述符fd
。然后,使用read
函数从该文件中读取最多sizeof(buffer) - 1
字节的数据到buffer
中。这里减1
是为了在缓冲区末尾留出空间放置一个null字符,以确保可以将缓冲区内容作为字符串安全打印。读取操作后,检查read
的返回值以确定操作是否成功。最后,打印读取的数据并关闭文件。
注意
- 在使用
read
函数时,需要确保文件描述符指向的文件已经以适当的模式(如只读或读写)打开。 - 读取操作可能会因为各种原因(如文件末尾、信号中断或资源暂时不可用)而读取的字节数少于请求的字节数。因此,可能需要根据返回的实际字节数和特定的应用逻辑来进行适当的处理。
- 对于非阻塞的文件描述符,如果没有数据可读,
read
会立即返回-1
,并且errno
被设置为EAGAIN
或EWOULDBLOCK
。