- 论坛徽章:
- 95
|
原帖由 shuzhiquan 于 2004-11-24 15:05 发表
( :,我说的新进程是指执行的东东不一样了嘛,不是说又fork了一个,已经很明确了,只有fork才能有新进程的.
我的意思是说原来的空间都覆盖了,怎么原来的文件描述字还有呢??
进程的打开文件列表是在内核中维护的(用户态要想访问这些打开文件只有通过文件描述符,但是如果你自己把某个文件描述符搞忘记了,例如说通过执行 exec 把自己的地址空间替换了,并不意味着内核就会忘记你曾经打开过该文件),只要不关闭(显式或者隐式),就一直是打开的,至于这些打开的文件你能不能访问,那是另外一回事情。例如说,
- fd = open("foo", ...);
- fd = -1;
复制代码
那么,这个 foo 文件在该进程生存期间一直是打开的,但是你却访问不了,也关不了(当然,如果你可以猜出其对应的文件描述符,那么另说)。
另外,在 exec 过程中仍然打开的文件也未必就无法访问。由于对某些文件描述符的使用存在约定,例如说 0, 1, 2,那么可以在执行 exec 之前将这些描述符 dup 成需要的,然后通过 exec 执行的程序就可以通过这些约定的文件描述符访问对应的文件(此即重定向的一般实现方法)。
[ 本帖最后由 MMMIX 于 2007-6-28 11:24 编辑 ] |
|