C - Два процесса, читающие один и тот же файл

У меня есть функция, которая читает файл и возвращает целое число. Есть два процесса, которые используют эту же функцию, и я получаю ошибку сегментации.

Функция чтения:

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

Разве два разных процесса не могут одновременно читать один и тот же файл? Если нет, то как бы я дал одному процессу приоритет, чтобы потом другая функция могла выполнять функцию чтения?

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

При этом не используются неинициализированные переменные или нулевые указатели, которые могут вызвать сбои.

Ваша проблема не имеет ничего общего с темами.

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

Вы пишете в неинициализированную память.

Вам нужно выделить некоторое хранилище за указателем "line". Просто измените объявление на char line[10],

Ps. Нет проблем при чтении файла из нескольких процессов.

Другие вопросы по тегам