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. Нет проблем при чтении файла из нескольких процессов.