我从execve的man页中读到,如果一个进程(A)调用execve,那么已经打开的文件描述符会被复制到新的进程(B)。
这里有两种可能性:
1)这是否意味着为进程B创建了一个新的文件描述符表,其条目从进程A的旧文件描述符表中复制而来?
2)或者进程B获得了进程A的文件描述符表,因为在执行execve后,进程A将不再存在,已经打开的文件只能从进程B关闭,如果它获得了进程A的文件描述符表。
哪一个是正确的?
我从execve的man页中读到,如果一个进程(A)调用execve,那么已经打开的文件描述符会被复制到新的进程(B)。
这里有两种可能性:
1)这是否意味着为进程B创建了一个新的文件描述符表,其条目从进程A的旧文件描述符表中复制而来?
2)或者进程B获得了进程A的文件描述符表,因为在执行execve后,进程A将不再存在,已经打开的文件只能从进程B关闭,如果它获得了进程A的文件描述符表。
哪一个是正确的?
execve
不会创建新的进程。它会使用文件系统中可执行文件替换调用进程的程序镜像、内存空间等内容,描述符表也会被修改,关闭任何设置了 close-on-exec 标志的描述符;其余的描述符保持打开状态,并且与 execve
前一样(当前位置、锁等)。
你可能把这个和 fork
发生的事情混淆了,因为 execve
通常是在 fork
之后发生的。当一个进程 fork 时,子进程拥有一个新的文件描述符表,引用与父进程相同的打开文件描述符。