【问题标题】:C - Two processes reading the same fileC - 两个进程读取同一个文件
【发布时间】:2015-04-18 23:19:07
【问题描述】:

我有一个读取文件并返回整数的函数。有两个进程使用相同的功能,我遇到了分段错误。

读取函数:

int getNumberFromFile() {

    FILE* fp;
    char* line;

    fp = fopen(fileName, "rb");
    fgets (line, 10, fp);
    fclose(fp);

    return atoi(line);

}

函数用法:

pid_t pid = fork();

if (pid == 0) {
    struct process p1;
    p1.processId = getpid();

    printf("N: %d, PID: %d", getNumberFromFile(), p1.processId);
}
else if (pid > 0 ) {
    struct process p2;
    p2.processId = getpid();

    printf("N: %d, PID: %d", getNumberFromFile(), p2.processId);
}
else {
    printf("Error: Could not create process\n");
}

两个不同的进程不能同时读取同一个文件吗?如果不是,我将如何给一个进程优先级,以便其他函数可以在之后执行读取功能?

【问题讨论】:

    标签: c process operating-system fork


    【解决方案1】:

    您需要在“行”指针后面分配一些存储空间。只需将声明更改为char line[10]

    附言。从多个进程读取文件没有问题。

    【讨论】:

      【解决方案2】:

      您的问题与线程无关。

       char* line;
       fgets (line, 10, fp);
      

      您正在写入未初始化的内存。

      【讨论】:

        【解决方案3】:

        无论您有一个或两个进程使用该功能,都会出现您的问题;功能有问题。您还没有分配任何空间来读取该行:

        int getNumberFromFile()
        {
            FILE* fp;
            char* line;                  // Uninitialized pointer
        
            fp = fopen(fileName, "rb");  // Unchecked - errors possible
            fgets(line, 10, fp);         // Unchecked - and bad news if fopen() failed
            fclose(fp);                  // Bad news if fopen() failed
        
            return atoi(line);
        }
        

        你似乎想要:

        int getNumberFromFile(const char *fileName)
        {
            FILE *fp = fopen(fileName, "rb");
            int rv = 0;
            if (fp != 0)
            {
                char line[10];
                if (fgets(line, sizeof(line), fp) != 0)
                    rv = atoi(line);
                fclose(fp);
            }
            return rv;
        }
        

        这不使用未初始化的变量或空指针,这两者都可能导致崩溃。

        【讨论】:

        • 您的这个回答可以帮助克服 OP 对线程的困惑 :) - stackoverflow.com/questions/16806998/…
        • @KcDoD:有时候——很多时候——回答问题比找到合适的副本更容易。在这种情况下,另一个问题/答案不是直接重复的,尽管它确实涵盖了一些要点。不过,我需要稍微修正一下其他答案。
        • 我不是说它是重复的 ;) .. 是的,添加更多细节会很棒。
        猜你喜欢
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-05
        • 2010-11-28
        相关资源
        最近更新 更多