c - 读写 C 系统调用是否使用缓冲区?

标签 c io system-calls read-write

我正在和一位老师交谈,他告诉我读写系统调用正在使用缓冲区,因为你的系统规范中有一个变量控制你可以访问你想要读/写的设备的次数当他等待在设备上写入时,系统使用缓冲区来存储数据。

我在另一篇 Stack Overflow 帖子 (C fopen vs open) 中看到,fopenfwrite 函数的优点之一是这些函数使用缓冲区(即应该会更快)。 我已经阅读了 read 和 write 系统调用的手册页,并且手册页没有讨论任何缓冲区。

我是不是误会了什么? read/write C 系统调用缓冲区如何工作?

最佳答案

您提到的函数 readwrite 是系统调用,因此它们的行为依赖于平台。

如您所知,freadfwrite是C标准库函数。它们在用户空间中进行缓冲,并以这种方式优化典型应用程序的性能。 readwrite 是不同的。用户空间 C 库(例如 GNU libc)中有一些用于这些函数的 stub 代码,但该代码的主要功能只是提供一个方便的包装器来调用正确的内核功能(但也可以使用 syscall() 调用该功能)直接!)

如果您对详细信息感兴趣,here 是一个示例:uclibc 库中 write 系统调用的包装器。

因此 readwrite 的典型实现不在用户空间中进行缓冲。不过,它们仍然可能在内核空间中进行缓冲。阅读 O_DIRECT 标志以获取更多详细信息:How are the O_SYNC and O_DIRECT flags in open(2) different/alike?

关于c - 读写 C 系统调用是否使用缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48688650/

相关文章:

c - 如果有 %ld 甚至 %lld,为什么还要使用 %d 甚至 %hd?

java - 在 Android 上检查文件的问题

c - 为什么终端 session 结束时所有进程都被杀死?

c - 我试图将一个数组传递给我的函数,但输出中没有显示任何内容,为什么?

c - 在没有 CUDA 的情况下检测 NVIDIA GPU

c++ - 在 n! 的最后查找零的个数

python - 如果我以附加模式打开文本文件,我可以找出我所在的行号吗?

Java多线程服务器

linux - syscall(2) 是标准的一部分吗?

linux - find_task_by_vpid() 的替代方案