LINUX.ORG.RU
ФорумAdmin

Как поделить файл между процессами

 


0

1

1 процесс периодически создает файл, другой процесс его хочет скопировать и удалить. Иногда возникает ошибка доступа, если в один момент копирует, а тот пытается создать. Как быть?

★★★★

У тебя именно процессы или треды?

Если треды - то наверняка pthread и тогда pthread_mutex_lock/unlock при доступе к файлу.

Если именно процессы, то либо классический локфайл, либо sem_wait/sem_post, либо можно например в shm создать кусок памяти завести в нём pthread_mutex и дальше пользоваться pthread_mutex_lock/unlock.

Stanson ★★★★★
()

у тебя алгоритм полностью не прописан.
Что должно происходить, если первый процесс производит файлы быстрее чем второй их потребляет?
Блокировка первого процесса? Формирование очереди файлов? Перезапись файла? Другое?

MirandaUser2
()
Ответ на: комментарий от gobot

Так-то переименование-перемещение должно быть одной атомарной транзакцией в моём понимании. Но вы лучше попробуйте, поиспытывайте. Это ещё от файловой системы может зависеть.

unDEFER ★★★★★
()
Ответ на: комментарий от unDEFER

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

А...вот почему копировал. Файло же нельзя переименовать когда файл пишется... мда... дела

gobot ★★★★
() автор топика
Последнее исправление: gobot (всего исправлений: 1)

Опиши нормально проблему, начни с того чтобы процитировать эту самую ошибку доступа и уточнить, в каком именно месте ты её видишь. И опиши желаемый результат чётко.

firkax ★★★★★
()

Просто добавь Кафку. Один процесс запихивает файл в топик, второй процесс считывает файл из топика, а кафка в докер-композ работает.

Дешево и сердито.

Nurmukh ★★★
()
Ответ на: комментарий от anonymous

Это не нытьё. Советуя наобум можно насоветовать что-то совершенно непригодное и вредное. Автор действительно не указал ряд существенных деталей, от которых неизбежно зависит правильное решение, и пренебрежение ими будет вести к систематической порче или потере данных, или и тому и тому вместе.

Впрочем, автора порча данных возможно устраивает, но нормальные люди в таком участвовать не захотят.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Ты не понимаешь банальных вещей, как отвечать на вопросы с недостаточными вводными. Поучись у ChatGPT5. Никаких «наобум».

На все неизвестные делается оговрка «Если вы имели в виду …» Ответ выстраиваится в последовательную логическую цепь с разветвлениями, охватывающими все варианты. Никаких вредных советов быть не может.

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

anonymous
()
Ответ на: комментарий от anonymous

Ты не понимаешь банальных вещей, как отвечать на вопросы с недостаточными вводными

Мало кому доступно подобное понимание, такого рода специалисты скорее всего заняты решением совсем других проблем за серьезные деньги и врядли присутствуют здесь

По теме дискуссии см. Проблема XY

alx777 ★★
()

другой процесс его хочет скопировать и удалить

Можно через хардлинк, например. После удаления файла первым процессом его содержимое останется под другим именем.

Radjah ★★★★★
()

Похожая задача решена миллион лет назад в logrotate. Суть в том, что лог переименовывается из /var/log/xyz в /var/log/xyz.1, но сервис xyz его держит открытым и продолжает писать по дескриптору (и пофиг на имя). После переименовывания logrotate пинает (sighup или перезапуск) сервис, чтобы он закрыл лог и открыл снова. Сервис открывает+создаёт лог с дефолтным именем /var/log/xyz и продолжает штатно работать, а /var/log/xyz.1 можно спокойно обрабатывать, сжимать, удалять. При этом ни одна строка данных не теряется.

legolegs ★★★★★
()