Читать одну строку из файла, переписывая эту строку из другого процесса.С - PullRequest
0 голосов
/ 31 января 2012

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

Таким образом, файл обновляется, когда мое приложение записывает в него.Вот код для этого:

dmHubRead = fopen ("/tmp/file", "w");
if (!dmHubRead) {
        log_error ("can't create /tmp/file: %m");
        return 0;
    }

fprintf (dmHubRead,
     "value %02d:%02d:%02d;\n",
     t->x, t->y, t->z);

fflush (dmHubRead);
fclose(dmHubRead);

Моя другая программа затем открывает файл и хочет прочитать первую строку довольно часто.Эта программа не закрывает файл между чтениями.Вот код этой программы:

if ((_file = fopen(FILE_PATH, "r")) < 0) {
        DebugLogger::put(DebugLogger::Error, "Could not open file.", __FILE__, __LINE__);
}
...
size_t sz = 0;
char *line = NULL;

if(fsync(fileno(_file)) < 0) {
  perror("fsync");
}

rewind(_file);
getline(&line, &sz, _file);

Так что моя проблема в том, что это не работает.Создает ли fopen в записывающей части новый файл каждый раз?Или в чем проблема и как ее можно решить?

1 Ответ

1 голос
/ 31 января 2012

Ваша сторона «записи» создает новый файл при каждом запуске. Сторона чтения не работает, потому что дескриптор файла становится недействительным каждый раз, когда вы пишете новый файл. Если вы открываете файл каждый раз, когда получаете к нему доступ, ваш код должен работать. Как упоминал Иоахим, есть более элегантные способы сделать это. Вы не упомянули, на какой системе вы работаете. В зависимости от того, Windows это, Linux или какая-то другая ОС, существуют лучшие механизмы для IPC. У вас также есть проблема синхронизации. Может ли ваше чтение когда-либо происходить между открытием нового файла и записью данных? Как насчет использования сокетов? Таким образом, вы можете определить, ожидают ли новые данные.

...