我是C新手,这甚至是我在“stackoverflow.com”中要问的第一个问题
如果我做了不愉快的事,请纠正我:)
所以,我想了解的是“读函数”的真正过程是什么。
让我详细说明我的问题,同时解释我的实验。
我的小程序的基本概念是将文件复制到屏幕上。
#include <stdio.h>
#include <fcntl.h>
#define BUF_SIZE 1000
int main(int argc,char *argv[])
{
int fd, n;
char buf[BUF_SIZE];
char *name;
name = argv[1];
fd = open(name, O_RDWR, 0);
//------------whith while loop -----------------------
//while( (n = read( fd, buf, BUF_SIZE)) > 0 )
// {
// printf("?");
//
// write(1, buf, n);
// printf("??");
// }
// ------------without while loop ----------------
n = read( fd, buf, BUF_SIZE);
printf("?");
write(1, buf, n);
printf("??");
return 0;
}
首先,(1)我的问题是“为什么我需要while loop for read()?
我的理解是,在我调用系统调用“read()”之后(我不确定它是真正的系统调用还是C库提供的调用真正系统调用的函数),
它现在得到buf[]和buf_大小来填写,它发生在一个调用但话说回来,应该有理由把while循环。。
但是两者的结果是相同的,显示的是完全相同的文件内容。
第二,(2)我的问题是,如果系统调用“read”在文件结束之前被调用了几次,那么在循环调用“write function”时可以进入多少时间(这就是为什么我把printf(“?”).
但结果中风。。。
它忽略了printf函数,不管它是在“write”之前还是之后调用的。
我想我错过了一个很大的概念我希望有人能帮我:)
提前谢谢你。
最佳答案
好吧,一步一步来您正在调用的read
函数实际上是一个可能称为sys_read
的低级系统cal的包装器通常C标准库为所有系统调用提供包装器。
为什么是while
循环?read
函数返回函数读取的字节数这不是文件包含的所有字节所必需的您需要一个while循环来继续读取文件,以便能够完全处理它如果两个版本都工作(有循环和没有循环)可能是(最肯定的)因为文件很小,并且您能够将其完全存储在数组中,但是什么是abaut 1GB文件?write
函数的行为或多或少是相同的,有时还需要一个while
循环来完全转储文件中的缓冲区。
为什么printf
不打印?printf
函数通常在将数据转储到控制台之前缓冲数据通常,它会等到看到行尾字符后再转储,因此如果将代码更改为:printf("??\n");
,则可能会在屏幕上看到它。
还有一件事,当然还有很多关于这些的技术知识(很多),所以如果您真的想了解read
函数(以及任何其他Unix系统调用或C库函数),可以参考手册第2页和第3页(系统调用2页,库函数3页)read
例如记录在read(2)
中如果你想更深入一点,去获取源代码,看看真正的工作原理:)
希望这有帮助!
关于c - 我无法弄清楚c中的系统调用“读取”功能。 (K&R c语言书),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22289472/