相关疑难解决方法(0)

你怎么读C中的scanf直到EOF?

我有这个但是一旦它到达假定的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)

c scanf eof

30
推荐指数
4
解决办法
14万
查看次数

文件读取时创建了不需要的子进程

我正在创建一个多进程程序.当我尝试使用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:我有一个理论,我无法证明它也许你可以帮助我.可能是这样的情况:文件指针在进程之间共享,当子进程退出时,它关闭文件,当父进程再次尝试读取时,它只是从头开始(或其他一些奇怪的行为).可能是这样吗?

c multiprocessing

9
推荐指数
1
解决办法
302
查看次数

Linux x86-64 fork 系统调用对 C 标准 libc 文件 I/O 的奇怪行为(关键字:fork、fclose、linux)

故事

我试图在 Linux 上诊断用 C 编写的应用程序中的错误。原来这个bug是由于在父进程中句柄仍然打开时在子进程中忘记 引起的。fcloseFILE *

文件操作只是read. 没有写操作。

情况1

该应用程序正在运行Linux 5.4.0-58-generic。在这种情况下,错误发生了。

案例二

该应用程序正在运行Linux 5.10.0-051000-generic。在这种情况下,没有错误,这正是我所期望的。

什么是错误?

fork如果fclose子进程中没有,则父进程执行随机数的系统调用。

案例2肯定

我完全知道忘记 fclose会导致内存泄漏,但是:

  • 我认为,只是在这种情况下,并不是绝对必要的,因为子进程会尽快退出,而我使用的退出exit(3)不是_exit(2)
  • 奇怪的是,为什么在子进程中忘记 fclose会影响父进程?

我目前的猜测:

这是一个 Linux 内核错误,已在5.4. 然而我没有证据,但我的测试向我证明了这一点。


我已经能够通过fclose在退出之前调用子进程来修复这个应用程序错误。但是,我想知道在这种情况下实际发生了什么。所以我的问题是如何fclose在子进程中忘记影响父进程?


重现问题的非常简单的代码(附上 3 个文件)。

注意:test1.c 和 test2.c 的区别只fclose在于子进程。test2.c 不会fclose在子进程中调用。

文件测试.txt

123123123
123123123
123123123
123123123
123123123 …
Run Code Online (Sandbox Code Playgroud)

c linux fork x86-64 stdio

6
推荐指数
1
解决办法
155
查看次数

fork和(failed)exec后C文件指针改变

我做了制作叉子的程序,我认为孩子不影响父母.

但是文件指针已更改,但我没有对父进行任何更改.

#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失败也可以使文件指针不变?

c linux fork file

5
推荐指数
1
解决办法
455
查看次数

标签 统计

c ×4

fork ×2

linux ×2

eof ×1

file ×1

multiprocessing ×1

scanf ×1

stdio ×1

x86-64 ×1