我正在研究我的学习目的操作系统内核,现在我对标准流的创建时间感到困惑。
著名的“APUE”说“按照惯例,UNIX系统shell将文件描述符0与进程的标准输入相关联,文件描述符1与标准输出相关联,文件描述符2与 标准错误。shell 和许多应用程序都使用此约定;这是 不是 UNIX 内核的功能。”
如果我没记错的话, fork() 和 execve() 不会更改那些打开的文件。这是否意味着内核没有责任为用户进程准备这些标准流?(按照惯例,内核不应该这样做?)提供程序入口点(例如 crt.c)的 c 库源文件也不应该这样做吗?
从这个stackexchange问题下的答案,我只能确保POSIX.1只要求这三个流应对应于fileno 0、1和2。
准备三个标准流通常是通过命令行 shell 完成的。当 shell 即将运行程序时,它可以分叉、配置三个标准流(根据需要连接到终端、管道或文件),然后使用
exec*
函数之一来执行程序。