系统I/O与标准I/O对比

系统I/O和标准I/O各有适用场景,理解它们的差异对于编写正确的I/O代码至关重要。

系统I/O(Unix I/O)

  • 接口:open/read/write/close
  • 直接调用内核系统调用,无缓冲(每次调用涉及用户态-内核态切换)。
  • 适合:网络套接字、信号处理中重新被中断的系统调用、需要细粒度控制的场景。
  • 缺点:接口原始,短计数需手动处理,编程繁琐。

标准I/O(C标准库)

  • 接口:fopen/fread/fwrite/fclose/printf/scanf
  • 库函数,在用户空间维护缓冲区,减少系统调用次数。
  • 适合:普通磁盘文件操作、文本行处理、格式化输入输出。
  • 缺点:不适用于套接字等某些文件类型;不易与信号处理等异步机制配合。

重要限制——不要混用

  • 对同一文件描述符同时使用系统I/O和标准I/O会导致双重缓冲问题(数据可能被标准I/O缓存而未实际写入)。
  • 若必须混用,需在所有系统I/O前调用 fflushsetvbuf 禁用缓冲。
  • 在套接字编程中必须使用系统I/O(标准I/O的行缓冲可能导致死锁)。

经验法则

  • 普通文件:优先使用标准I/O。
  • 网络/设备:使用系统I/O或RIO包。

链接到

  • 上一个知识点:10.13 标准I_O库
  • 下一个知识点:无(本章最后一个知识点)