系统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前调用
fflush或setvbuf禁用缓冲。 - 在套接字编程中必须使用系统I/O(标准I/O的行缓冲可能导致死锁)。
经验法则:
- 普通文件:优先使用标准I/O。
- 网络/设备:使用系统I/O或RIO包。
链接到
- 上一个知识点:10.13 标准I_O库
- 下一个知识点:无(本章最后一个知识点)