【发布时间】:2010-10-20 15:38:33
【问题描述】:
我已经在 C 中使用系统调用(打开、读取和写入)来模拟 Linux 系统中的“cat”函数,它比真实的要慢...
我使用与真正的“猫”相同的缓冲区大小,并使用“strace”,我认为它进行了相同数量的系统调用。但是我的“猫”的输出比真正的“猫”要慢一点。
这是我的代码:
#define BUFSIZ 32768
int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
ssize_t writtenBytes = 0;
while(writtenBytes < readBytes) {
writtenBytes += write(fdout,
buffer + writtenBytes, readBytes - writtenBytes);
if(writtenBytes == -1) {
return -1;
}
}
return 0;
}
int catPrint(int fdin, int fdout) {
char buffer[BUFSIZ];
ssize_t readBytes;
do {
readBytes = read(fdin, buffer, BUFSIZ);
if(readBytes == -1) {
return -1;
}
if(sysWriteBuffer(fdout, buffer, readBytes) == -1) {
return -1;
}
} while(readBytes > 0);
return 0;
}
我正在读取一个文件(我将其作为参数传递给 main,我认为这里不需要代码),而不是使用该文件描述符调用 catPrint() 函数,输出描述符为 1,因此它打印到标准输出。
我不明白为什么它会变慢,因为我使用相同的文件进行测试,并且对于两者(真正的“猫”和我的),整个文本只有一个 read() 和一个 write()。整个文本不应该只显示在屏幕上吗?
P.S:我已将此标记为作业,尽管我在这里的问题(为什么它变慢)不是作业的一部分。我只需要使用系统调用创建一个“cat”类型的函数,就完成了。我只是对我的代码有点慢很感兴趣。
我的愚蠢解决了问题:
我只是决定在同一个文件上调用 linux 的原始 cat 几次,一个接一个,我只是意识到我调用它的某些时候它也很慢,就像我自己的一样慢。我想一切都比……还好。
很抱歉像这些人一样浪费你的时间。
【问题讨论】:
-
恕我直言,
homework标签具有误导性。您的问题涉及一个有趣的背景事实。homework意味着乏味的初学者工作或(在规模的另一端)一个测验问题。 -
顺便说一句,如果错误发生在第二次 write() 上,则错误(即写入返回 -1)处理不正确。
-
如果您认为更好,您可以删除作业标签... jpalecek 是什么意思?只有一次写入(如在系统调用中)我只有一个辅助功能。如果该辅助函数中的 write() 失败,我需要将 -1 一直返回到调用 catPrint() 的位置...
-
这里只是问一下——cat 使用系统调用而不是 fread、fwrite 缓冲的吗?
-
@Blingo:cat 很可能使用系统调用而不是 fread() 和 fwrite()。它不需要标准 I/O(fread() 等)优化的小型 I/O 单元;它处理文件的大块 - 可能比标准 I/O 缓冲区大小更大。
标签: c linux system-calls cat