C系统调用-执行关闭其文件的进程?

C系统调用-执行关闭其文件的进程?,c,exec,system-calls,file-descriptor,C,Exec,System Calls,File Descriptor,基本上,我在为一门系统编程课做作业时,想出了一个奇怪的思维实验。我回来后的行为有点令人惊讶,我想知道是否有人能解释发生了什么 我有以下两个源文件: prog.c: #include <fcntl.h> #include <stdio.h> int main() { printf("%d\n", close(3)); return 0; } #include <fcntl.h> #include <unistd.h> #incl

基本上,我在为一门系统编程课做作业时,想出了一个奇怪的思维实验。我回来后的行为有点令人惊讶,我想知道是否有人能解释发生了什么

我有以下两个源文件:

prog.c:

#include <fcntl.h>
#include <stdio.h>

int main()
{
    printf("%d\n", close(3));

    return 0;
}
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

extern char **environ;

int main()
{
    char *args[] = {"prog", NULL};
    int fd = open("prog", O_RDONLY);

    fexecve(fd, args, environ);

    printf("-> %d\n", close(fd));

    return 0;
}
我的直觉让我失望了。FD 3已成功关闭,但这会导致程序丢失。
fexecve
不应该在调用堆栈上吗?为什么子流程的文件需要打开才能让exec找到回家的路?exec函数在做什么?当我这样破坏它时,它们不能做什么


我不希望这是我实际应用中需要知道的东西,但我很好奇。任何解释都将不胜感激

manfexecve:[…]对fexecve()的成功调用永远不会返回
@EOF-这应该是一个答案,因为这就是答案,除非问题被改变,否则故事就到此结束了。。。。这意味着如果
prog
什么都不做,行为是一样的。这太奇怪了,我觉得我读手册的时候比我读的更仔细。@ChrisStratton:你想让我写一行回答一个两页的问题吗?很诱人,但不是。@Kebertex:你有机会回答你自己的问题!如果你把它作为一个好的、长的、信息丰富的答案,它可能对其他人有用。
(gdb) break main
Breakpoint 1 at 0x40065e: file shell.c, line 9.
(gdb) r
Starting program: /home/kebertx/shell 

Breakpoint 1, main () at shell.c:9
9           char *args[] = {"prog", NULL};
(gdb) n
10          int fd = open("prog", O_RDONLY);
(gdb) 
12          fexecve(fd, args, environ);
(gdb) 
process 4256 is executing new program: /home/kebertx/prog

Breakpoint 1, main () at prog.c:6
6           printf("%d\n", close(3));
(gdb) 
0
8           return 0;
(gdb) 
9       }
(gdb) 
0x00007ffff7a58800 in __libc_start_main () from /usr/lib/libc.so.6
(gdb) 
Single stepping until exit from function __libc_start_main,
which has no line number information.
[Inferior 1 (process 4256) exited normally]
(gdb) quit