Chinaunix

标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解?? [打印本页]

作者: shuzhiquan    时间: 2004-11-24 13:13
标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解??
书上说“当子进程exec一个新的程序时,调用进程中打开的文件描述符仍然保持打开,但设置了执行即关FD_CLOEXEC的文件描述字除外。如果该标志设置,则描述字在exec时将被关闭。否则该描述字在exec后仍保持打开。”
  这句话是不是这样理解的:调用进程是指调用exec的那个子进程,如果在子进程中的某个文件描述字该标志设为了1,则子进程exec后该文件描述字就被关闭?否则就仍为打开???可是exec后子进程不就退出了吗???还有什么文件描述字没有关闭呢???不知道怎么理解??望高手解释下。
作者: lenovo    时间: 2004-11-24 13:40
标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解??
>;>;可是exec后子进程不就退出了吗???
你都没理解exec的真正意思。
man exec
作者: zealotcat    时间: 2004-11-24 14:03
标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解??
我也不太明白这个问题
作者: shuzhiquan    时间: 2004-11-24 14:07
标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解??
是我说错了,应该是exec后新进程就退出了。
exec后,由新进程的地址空间替代调用进程的地址空间,对于原调用进程的地址空间会被释放掉。
那么所谓的调用进程中打开的文件描述字仍保持打开是指在exec的新进程中保持打开吗??(好像不对吧??)原进程都的地址空间都被释放了,还怎么保持这个文件描述字呢??
请lenovo版主赐教。谢谢。
作者: lenovo    时间: 2004-11-24 14:11
标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解??
》》对于原调用进程的地址空间会被释放掉。
你从哪里理解的这句话?

》》那么所谓的调用进程中打开的文件描述字仍保持打开是指在exec的新进程中保持打开吗?
这个你的理解是对的,不要怀疑。
作者: aero    时间: 2004-11-24 14:20
标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解??
吧exec看作是对原来进程的一个“注入”吧,没有另起一个,终止一个的说法。再说了,进程终止,进程的空间,也不叫“释放”啊!进程空间,这个概念要好好理解。
作者: shuzhiquan    时间: 2004-11-24 14:31
标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解??
呵呵。首先谢谢大家的帮助。
我是在《unix环境高级编程》下看的说:
1。exec函数调用成功时系统将用一个新程序的地址空间替代调用进程的地址空间并装入新进程的内容;而对于老的地址空间如果是由fork创建的则释放,如果是由vfork创建的则返回老的地址空间给父进程。
2。exec用新程序的地址空间覆盖当前程序的地址空间时,它只覆盖正文段,数据段和栈段。
作者: albcamus    时间: 2004-11-24 14:39
标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解??
什么是新进程?就是exec一个程序(磁盘上的某个可执行程序,二进制的或脚本解释的),把这个可执行程序文件给load进内存,用它的text段、data段、stack段等替代fork()出来的那个进程,就是子进程,继承过来的那些。

总觉得好多人把进程跟程序搞混,其实区别很重要呢
作者: shuzhiquan    时间: 2004-11-24 14:53
标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解??
albcamus兄所说的在操作系统教材里都明确讲过了,偶知道的说,那就是调用进程的栈段空间被覆盖了哦。
那原来调用进程的文件描述字变量所存放的栈空间(假设该文件描述字是个局部变量在进程的栈空间)不就被覆盖了吗??
然后又由于FD_CLOEXEC被设置为了0,则在exec的新进程中还存在这个文件描述字,怎么感觉像继承样的阿.
作者: albcamus    时间: 2004-11-24 14:56
标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解??
打开的文件,操作系统要为每个进程维护一张表,不是简单的放在进程的Stack就完事儿啊。而且,stack、text、bss、data那些概念,都是用户进程空间的,进程还有系统空间啊,这个就不是它自个儿说了算的了:-)
作者: aero    时间: 2004-11-24 14:58
标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解??
看看,进程ID都没有变。

未命名.jpg (54.85 KB, 下载次数: 32)

未命名.jpg

作者: shuzhiquan    时间: 2004-11-24 15:05
标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解??
( :,我说的新进程是指执行的东东不一样了嘛,不是说又fork了一个,已经很明确了,只有fork才能有新进程的.
我的意思是说原来的空间都覆盖了,怎么原来的文件描述字还有呢??
作者: albcamus    时间: 2004-11-24 15:13
标题: 请教文件描述符标志FD_CLOEXEC设置怎样理解??
原帖由 "shuzhiquan" 发表:
( :,我说的新进程是指执行的东东不一样了嘛,不是说又fork了一个,已经很明确了,只有fork才能有新进程的.
我的意思是说原来的空间都覆盖了,怎么原来的文件描述字还有呢??


execve()启动loader来加载一个可执行程序,覆盖空间;但是注意,覆盖空间知识覆盖用户空间,系统空间根本不在被覆盖的范围内,能把tastk_struct的参数调整几个就不错了。这里我不大懂,但道理就是这么一回事:-)
作者: asdf511    时间: 2007-06-28 08:52
“由一个现有进程调用6个exec函数中的某一个,exec把当前进程映象替换成新的程序文件,而且该新程序通常从main函数开始执行,进程id并不改变。我们称调用exec的进程为调用进程(calling process),称新执行的进程为新程序(new program).”-------摘自<<UNIX网络编程第三版>>P95
作者: MMMIX    时间: 2007-06-28 11:19
原帖由 shuzhiquan 于 2004-11-24 15:05 发表
( :,我说的新进程是指执行的东东不一样了嘛,不是说又fork了一个,已经很明确了,只有fork才能有新进程的.
我的意思是说原来的空间都覆盖了,怎么原来的文件描述字还有呢??

进程的打开文件列表是在内核中维护的(用户态要想访问这些打开文件只有通过文件描述符,但是如果你自己把某个文件描述符搞忘记了,例如说通过执行 exec 把自己的地址空间替换了,并不意味着内核就会忘记你曾经打开过该文件),只要不关闭(显式或者隐式),就一直是打开的,至于这些打开的文件你能不能访问,那是另外一回事情。例如说,

  1. fd = open("foo", ...);
  2. fd = -1;
复制代码

那么,这个 foo 文件在该进程生存期间一直是打开的,但是你却访问不了,也关不了(当然,如果你可以猜出其对应的文件描述符,那么另说)。

另外,在 exec 过程中仍然打开的文件也未必就无法访问。由于对某些文件描述符的使用存在约定,例如说 0, 1, 2,那么可以在执行 exec 之前将这些描述符 dup 成需要的,然后通过 exec 执行的程序就可以通过这些约定的文件描述符访问对应的文件(此即重定向的一般实现方法)。

[ 本帖最后由 MMMIX 于 2007-6-28 11:24 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2