C系统调用-执行关闭其文件的进程?
基本上,我在为一门系统编程课做作业时,想出了一个奇怪的思维实验。我回来后的行为有点令人惊讶,我想知道是否有人能解释发生了什么 我有以下两个源文件: prog.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
#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