c - read() 系统调用会复制数据而不是传递引用

标签 c linux process ipc

read() 系统调用导致内核复制数据,而不是通过引用传递缓冲区。我在接受采访时被问及这样做的原因。我能想到的最好的办法是:

  1. 避免跨多个进程对同一缓冲区进行并发写入。
  2. 如果用户级进程尝试访问映射到内核虚拟内存区域的缓冲区,则会导致段错误。

事实证明,面试官对这两个答案都不完全满意。如果有人能详细说明上述内容,我将不胜感激。

最佳答案

零复制实现意味着用户级进程必须有权访问内核/驱动程序内部用于读取的缓冲区。用户在使用完缓冲区后必须显式调用内核来释放缓冲区。

根据读取设备的类型,缓冲区可能不仅仅是内存区域。 (例如,某些设备可能要求缓冲区位于特定的内存区域中。或者它们只能支持在启动时向其写入固定的内存区域。)在这种情况下,用户程序将无法“释放”这些缓冲区(以便设备可以向其中写入更多数据)可能会导致设备和/或其驱动程序停止正常运行,这是用户程序永远不应该做的事情。

关于c - read() 系统调用会复制数据而不是传递引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5715245/

相关文章:

c - 阻止子进程从父进程接收 SIGINT

C 中的命令行参数和读取文件/打印文本

c - 注意: expected ‘int * (*)()’ but argument is of type ‘int’

二进制数的校验和?转换回十进制?

linux - 没有得到 scsi 的主机、id、 channel 号

linux - 如何在 shell 中创建别名以转到父目录

linux - 如何找到与 sbatch 作业相关的进程?

Linux - 按路径杀死进程

c - 在 realloc 之后组织指针数组

两个IP的比较