我有这个但是一旦它到达假定的EOF它再次重复循环和scanf.
int main(void)
{
char words[16];
while(scanf("%15s", words) == 1)
printf("%s\n", words);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在创建一个多进程程序.当我尝试使用for循环调用fork()时if(f == 0) break;.我得到了所需数量的子进程.
但是现在,我正在处理输入文件,并且最初不知道所需的进程数.这是我的代码中最小的可能示例.
FILE* file = fopen("sample_input.txt", "r");
while(fscanf(file, "%d", &order) == 1){
f = fork();
if(f == 0){
break;
}
}
Run Code Online (Sandbox Code Playgroud)
例如sample_input.txt:
5 2 8 1 4 2
Run Code Online (Sandbox Code Playgroud)
现在正在创建数千个子进程(我想要6,文件中的整数),可能是什么原因?它与文件指针有关吗?
编辑:我用控制台输出做了一些调试,子进程确实打破了循环.但是,父母一直在阅读一个小文件.如果我删除fork(),循环按预期执行6次.
编辑2:我有一个理论,我无法证明它也许你可以帮助我.可能是这样的情况:文件指针在进程之间共享,当子进程退出时,它关闭文件,当父进程再次尝试读取时,它只是从头开始(或其他一些奇怪的行为).可能是这样吗?
我试图在 Linux 上诊断用 C 编写的应用程序中的错误。原来这个bug是由于在父进程中句柄仍然打开时在子进程中忘记 引起的。fcloseFILE *
文件操作只是read. 没有写操作。
该应用程序正在运行Linux 5.4.0-58-generic。在这种情况下,错误发生了。
该应用程序正在运行Linux 5.10.0-051000-generic。在这种情况下,没有错误,这正是我所期望的。
fork如果fclose子进程中没有,则父进程执行随机数的系统调用。
我完全知道忘记 fclose会导致内存泄漏,但是:
exit(3)不是_exit(2)。fclose会影响父进程?这是一个 Linux 内核错误,已在5.4. 然而我没有证据,但我的测试向我证明了这一点。
我已经能够通过fclose在退出之前调用子进程来修复这个应用程序错误。但是,我想知道在这种情况下实际发生了什么。所以我的问题是如何fclose在子进程中忘记影响父进程?
fclose在于子进程。test2.c 不会fclose在子进程中调用。123123123
123123123
123123123
123123123
123123123 …Run Code Online (Sandbox Code Playgroud) 我做了制作叉子的程序,我认为孩子不影响父母.
但是文件指针已更改,但我没有对父进行任何更改.
#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));
}
Run Code Online (Sandbox Code Playgroud)
这输出
I'm one 21500 20
I'm two 21500 -1
Run Code Online (Sandbox Code Playgroud)
我想让两个printf调用之间的文件指针不变.
为什么文件指针会改变,即使execvp失败也可以使文件指针不变?