标准输入输出
Unix系统为每个进程默认打开三个标准I/O文件,它们是进程与外部世界通信的默认通道。
三个标准流:
- 标准输入(stdin,描述符0):默认从键盘读取输入。程序通过
scanf、read(0,...)等函数读取。 - 标准输出(stdout,描述符1):默认向显示器输出数据。程序通过
printf、write(1,...)等函数写入。 - 标准错误(stderr,描述符2):默认向显示器输出错误信息。与stdout分开以便于错误和正常输出的独立重定向。
I/O重定向的底层实现:
- Shell在创建进程后、执行程序前,通过
dup2系统调用重定向描述符。 - 例如,
ls > output.txt的实现是将描述符1重定向到output.txt文件。 - 程序的视角不变(仍然向描述符1写),但内核将数据写到了文件而非屏幕。
标准流的关闭:
exit函数会关闭所有打开的标准流并刷新缓冲区。- 在
_exit调用中,I/O缓冲区不会被刷新。