我正在编写一个简单的shell程序,但不确定在dup2()和execvp之后文件描述符表会发生什么。所以我有一个父进程等待子进程结束(waitpid)但是当它循环回来等待下一个用户输入时,我在子进程中使用dup2修改的文件描述符表怎么不在父进程中持久存在?是因为execvp将文件描述符表重置回原始文件?
编辑:我明白了。 fork函数实际上是程序映像的单独副本,包括文件描述符表,因此父进程的fd表不受影响。答案 0 :(得分:0)
无。当子进程由fork()
创建时,它会获取父进程的文件描述符的副本,但是在父进程没有被共享回父进程后进行更改。
(注意,虽然文件描述符 table 不与父共享,但文件描述符本身的状态是!例如,如果文件描述符上有seek()
,那么从其父级继承的子进程,也会影响父级的副本。)