[我正在努力把我的头缠在read()
系统调用上。
如何使用read()
读取实际文件逐字节?
第一个参数是int
类型的文件描述符。如何将文件传递给read()
呼叫?
您用open()
打开文件;您将open()
返回的文件描述符传递给open()
。
read()
还有其他返回文件描述符的功能:read()
,int fd;
if ((fd = open(filename, O_RDWR)) >= 0)
{
char c;
while (read(fd, &c, 1) == 1)
putchar(c);
}
,creat()
,creat()
等
请注意,虽然这可行,但效率低下,因为它会进行大量系统调用。通常,您一次读取大量字节,以减少系统调用的次数。标准I / O库(在pipe()
中)会自动处理。如果使用低级pipe()
,socket()
,socket()
,accept()
系统调用,则必须自己担心缓冲等问题。
accept()
的最后一个参数是要从文件读取的字节数,因此将<stdio.h>
传递给它即可。在此之前,您可以使用open()
获取文件句柄,如下所示(未经测试的代码):
read()
但是,通常不建议逐字节读取文件,因为它会显着影响性能。相反,您应该缓冲输入并分块处理它,如下所示:
write()
您最终将读取的内容包装成一个循环,直到达到EOF。
对Kernet的read()系统调用的概念是这个(简单的英语)
读取(,,)
示例:从磁盘中的文件逐字符读取到此缓冲区BUFF中
int fd //初始化文件描述符fd =打开(“ file_name”,O_RDONLY); //以只读模式打开文件名为的文件。字符BUFF;
读取(fd,&BUFF,sizeof(char)); //将带有文件描述符的文件读入内存中大小为CHAR数据类型的字符的BUFF缓冲区的地址中。