【问题标题】:fprintf returning null after fork() in cfprintf 在 c 中的 fork() 之后返回 null
【发布时间】:2018-11-13 16:21:23
【问题描述】:

我正在尝试用 fopen 打开一个文件,fork 当前进程并让子进程在文件上写一些东西;当子进程退出时,父进程应该读取文件的内容,但它读取“null”,即使文件已正确写入。没有错误报告。 这是我的代码:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

int main(int argc, char *argv[]){
    FILE * sharedFile;
    char *fileContent;
    if((sharedFile = fopen("testFile.txt","w+")) == NULL){
        fprintf(stderr,"Error while opening the file: %s",strerror(errno));
        return 0;
    }
    pid_t pid = fork();
    if(pid == 0){
        //Child
        fprintf(sharedFile,"%s",argv[1]);
        exit(0);
    }
    else{
        //Parent
        wait(NULL);
        if(fscanf(sharedFile,"%s",fileContent) < 0){
            fprintf(stderr,"Error while reading file: %s",strerror(errno));
            return 0;
        }
        fprintf(stdout,"File content: %s",fileContent); //Outputs "File content: (null)"
        fclose(sharedFile);
    }
}

奇怪的是,如果我在分叉后再次打开父代码中的文件,输出是正确的。 可能是什么问题?

【问题讨论】:

  • fileContent 是一个未初始化的指针时任何工作都是一个意外。这就是未定义行为的美妙之处。

标签: c file process fork


【解决方案1】:

fileContent 尚未分配任何空间。也许这样做

char fileContent[101];

...

if (fscanf(sharedFile,"%100s",fileContent) != 1) // Prevent buffer overflows. Should return one when successful.

【讨论】:

  • 感谢您的回答!我已经尝试过你的建议,但现在它打印“文件内容:成功”
  • @Stubborn:它还应该打印什么? ('success') 大概是文件中的第一个单词。
  • @JonathanLeffler 它应该打印由子进程设置的文件内容。我已经尝试在 fork 之后在父代码中使用 fopen 再次打开文件,并且输出是所需的
  • @Stubborn:不。这不可能会发生。这些进程共享相同的打开文件描述(不同于打开的文件描述符)。当孩子写字时,它也会移动父母的当前位置。这些文件的相关性比您意识到的要密切得多。在阅读之前,您的父进程必须寻找文件的开头 (fseek(sharedFile, 0, SEEK_SET))。如果有更多的互动,流程就必须更加仔细地协调。你有最简单的交互——一个写一次,另一个读一次。
  • @Stubborn:您可以阅读关于open()fork()dup2() 的 POSIX 规范中的潜在问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 2017-04-16
相关资源
最近更新 更多