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 ★★★★★
()