C-读取同一文件的两个进程

C-读取同一文件的两个进程,c,process,operating-system,fork,C,Process,Operating System,Fork,我有一个函数,它读取一个文件并返回一个整数。有两个进程使用相同的函数,我得到了一个分段错误 读取功能: 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 ==

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

读取功能:

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");
}

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

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


另外,从多个进程读取文件没有问题。

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


另外,从多个进程读取文件没有问题。

您的问题与线程无关

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

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

您的问题与线程无关

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

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

无论您有一个或两个进程使用该函数,您的问题都会出现;功能有问题。您尚未分配任何空间将该行读入:

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;
}

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

无论有一个或两个进程使用该函数,都会出现问题;功能有问题。您尚未分配任何空间将该行读入:

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对线程的混淆:)-@KcDoD:有时候,回答问题比找到合适的副本更容易,很多时候。在这种情况下,另一个问题/答案不是直接重复的,尽管它涵盖了一些要点。不过,我需要稍微修改一下另一个答案。我不是说它是重复的;)。。是的,添加更多细节会很好。您的回答有助于克服OP对线程的困惑:)-@KcDoD:有时候,很多时候,回答问题比找到合适的副本更容易。在这种情况下,另一个问题/答案不是直接重复的,尽管它涵盖了一些要点。不过,我需要稍微修改一下另一个答案。我不是说它是重复的;)。。是的,添加更多细节会很棒。