Параллельная обработка файлов веб-сервером Linux (чтение/запись)

Я надеюсь, что вы можете дать мне несколько советов по моей проблеме.

У меня есть веб-сервер, работающий на Raspberry Pi. На нем C-программа записывает JPEG-файл через определенный интервал времени (1 секунду) следующим образом:

fout = fopen("/tmp/image1.jpg", "w");
fwrite(jpgBuffer, jpgFileSize, 1, fout);
fclose(fout);

Я получаю доступ к изображению через свой веб-браузер: «192.168.178.xxx/tmp/image1.jpg». Большую часть времени изображение отображается идеально. Однако иногда я вижу артефакты на изображении.

Я предполагаю, что файл записывается во время запроса изображения из веб-браузера. Как избежать такого поведения? Или как я могу гарантировать, что файл не будет записан, пока он открыт для чтения во время запроса.

Я читал о блокировке файлов, но не уверен, что это правильный путь. Я знаю, что могу установить эксклюзивную блокировку с помощью функции flock перед записью в файл и затем разблокировать его. Но я также читал, что соответствующая функция открытия файла должна установить блокировку чтения или общую блокировку, чтобы этот метод работал. Однако я не знаю, устанавливает ли HTTP-запрос, который я выдаю через веб-браузер, такую ​​​​блокировку чтения.

Любые предложения приветствуются.

Большое спасибо!


person KoStein    schedule 16.01.2016    source источник


Ответы (1)


Запишите в другой временный файл, а затем переименуйте его в «/tmp/image1.jpg». Учитывая, что rename является довольно атомарным, ваша проблема, скорее всего, будет решена.

Возможным альтернативным подходом может быть использование обязательных блокировок: процесс записи устанавливает блокировку RW после открытия файла для чтения и записи, затем ядро ​​​​заблокирует веб-сервер от чтения файла до тех пор, пока блокировка не будет снята (явно или неявно, когда процесс записи завершается). Однако этот подход требует дополнительных шагов (файловая система должна быть смонтирована с параметром "mand", атрибут группы setgid должен быть установлен параметром "g+s", а также "g-x"), а также использование обязательных блокировок в Linux не одобряется.

person starikoff    schedule 18.01.2016