【发布时间】:2021-04-30 01:21:37
【问题描述】:
我制作了制作 fork 的程序,我认为 child 不会影响 parent。
但文件指针发生了变化,尽管我没有在父级中进行任何更改。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void) {
FILE *fp = fopen("sm.c", "r");
char buf[1000];
char *args[] = {"invailid_command", NULL};
fgets(buf, sizeof(buf), fp);
printf("I'm one %d %ld\n", getpid(), ftell(fp));
if (fork() == 0) {
execvp(args[0], args);
exit(EXIT_FAILURE);
}
wait(NULL);
printf("I'm two %d %ld\n", getpid(), ftell(fp));
}
这个输出
I'm one 21500 20
I'm two 21500 -1
我想让文件指针在两个printf 调用之间不发生变化。
为什么文件指针会改变,即使execvp 失败,我能否使文件指针不可改变?
【问题讨论】:
-
嗯。你真的在尝试执行“
invalid_command”吗? -
是的。命令不可用,因此它返回错误“没有这样的文件或目录”
-
在
strace下运行您的流程:strace -f -o /path/to/output/file ...将整个输出作为代码发布到问题中。看起来您对fork()的调用实际上是在使用vfork(),其中两个进程在调用之后和子进程中的任何后续exec*()函数调用之前共享相同的地址空间。你运行的是哪个版本的 Linux? -
我认为您很有可能遇到Why does forking my process cause the file to be read indefinitely? 中讨论/诊断的问题,或该问题的变体。另请参阅链接的问题(来自其他问题 - 链接是 Uwanted child processes being created while file reading)。
-
尝试在孩子中使用
_exit而不是exit。这为我修复了它(Ubuntu 16.04,gcc 5.4.0)。