Как синхронизировать файловый ввод / вывод многих независимых приложений в Linux? - PullRequest
0 голосов
/ 20 сентября 2018

Я пишу программное обеспечение для Linux, которое будет активно работать с файлами пользователя в фоновом режиме одновременно с другими приложениями, которые я не контролирую.Я хочу, чтобы фоновое приложение не переписывало изменения, внесенные другими приложениями.Но есть проблема - в отличие от Windows Linux не предоставляет возможности обязательной блокировки файлов, которая создает возможность испортить работу пользователя из-за условий гонки, которых я бы хотел избежать.

Итак, мне интересно - существуют ли в Linux файловые системы, обеспечивающие какие-то механизмы синхронизации, такие как операция сравнения и обмена , транзакции "все или ничего" , обязательная блокировка файлов (как в Windows)?

Ответы [ 4 ]

0 голосов
/ 30 сентября 2018

mmap, кажется, имеет такую ​​защиту, которую вы ищете: https://www.kernel.org/doc/html/v4.13/media/uapi/v4l/func-mmap.html

prot Аргумент prot описывает требуемую защиту памяти.Независимо от типа устройства и направления обмена данными оно должно быть установлено на PROT_READ |PROT_WRITE , разрешающий чтение и запись в буферы изображений.Драйверы должны поддерживать хотя бы эту комбинацию флагов.

0 голосов
/ 26 сентября 2018

Совместно используемые ресурсы требуют защиты от одновременного доступа, потому что, если несколько потоков выполнения обращаются к данным и манипулируют ими одновременно, потоки могут перезаписывать изменения друг друга или получать доступ к данным, пока они находятся в несогласованном состоянии.Одновременный доступ к совместно используемым данным - это рецепт нестабильности, который часто оказывается очень сложным для отслеживания и отладки - очень важно получить его сразу же [1]

Потоки могут использовать следующие два инструмента для синхронизации своих действий:мьютексы и условные переменные [2]

Мьютексы (сокращение от взаимного исключения) позволяют потокам синхронизировать использование общего ресурса, так что, например, один поток не пытается получить доступ к общей переменной нав то же время, когда другой поток изменяет его.

Переменные условия выполняют дополнительную задачу: они позволяют потокам сообщать друг другу, что общая переменная (или другой общий ресурс) изменила состояние.

Адаптированоиз:

[1] Любовь, Р. (2005).Разработка ядра Linux, второе издание.

[2] Kerrish, M. (2010).Интерфейс программирования Linux.

0 голосов
/ 29 сентября 2018

Я полагаю, что есть три возможных решения

1) Сделайте, чтобы все программы использовали пользовательскую библиотеку файлового ввода / вывода, которая реализует необходимые вам функции.Это решение может оказаться невозможным, если у вас нет доступа к исходному коду.Вы также можете использовать mmap, чтобы изменения записывались в память.Вы используете фоновый процесс для синхронизации грязных страниц с существующими или новыми файлами.

2) Замените стандартные библиотеки C / C ++ (такие как libc.so), которые будут использовать уязвимые программы.Вы можете использовать ldd, чтобы узнать зависимость библиотеки.Вам необходимо обновить исходный код для стандарта C / C ++ для реализации необходимых вам функций.Это может быть слишком сложно для большинства людей.

3) Создайте свою файловую систему.Вы можете ссылаться на многие статьи в Интернете, такие как https://kukuruku.co/post/writing-a-file-system-in-linux-kernel/. Это лучшее и самое чистое решение.

Надеюсь, это поможет.

0 голосов
/ 21 сентября 2018

Переименование является атомным .Ваше приложение должно сравнить «eTags» источника и назначения (возможно, при соответствующих блокировках), прежде чем принять решение о вызове rename ().

...