LINUX.ORG.RU
ФорумAdmin

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

 


0

1

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

★★★★

Мультиплексор поставить и кидать ему команды от процессов. Кстати, в бизнесе та же байда с доступом на склад.

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

Очень сильно подозреваю, что на уровне файловой системы конфликт доступа решается штатно, просто ты неправильно делаешь вызов процедуры записи.

Irma ★★★
()

Создай третий процесс который будет принимать команды от них и синхронизировать.

bcon
()

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

Если треды - то наверняка 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 ★★★★★
()
Ответ на: комментарий от gobot

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

Глупости, можно. Или ты спалившийся виндузятник?

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

В смысле нельзя? Разве? Насколько я знаю имя изменяется, а инф. узел остаётся и может быть в том числе открыт для записи любым процессом.

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

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

Почему? Именно переименовал, и копируй себе спокойно.

Aceler ★★★★★
()

я бы делал так:

  1. проц1 создает файл с именем $(mktemp) …
  2. проц1 переименовывает файл в /tmp/file_ready
  3. проц2 увидел файл /tmp/file_ready и переименовывает его в $(mktemp)
  4. проц2 копирует файл …
x905 ★★★★★
()
Ответ на: комментарий от x905

Он не указал желаемую логику работы, поэтому не факт что этот вариант именно то что он хочет.

firkax ★★★★★
()

Что мешает переименовать файл перед копированием, а потом работать с переименованным файлом?

vel ★★★★★
()

lsof если файла нет в списке,значит закрыт и можешь копировать или что там собираешься с ним делать

anonymous
()

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

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

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

Вообще он пишется где то раз в 1-2 сек.

экстремально не выполнимое задание вы себе нарисовали.

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

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

как раз можно.

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

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

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

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

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

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

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

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

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

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

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

alx777 ★★★
()

Подними микро сервис и передавай по сети через кубер. Файлы это не web-scale. Плюс портят диск.

anonymous
()

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

s-warus ★★★★★
()

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

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

Radjah ★★★★★
()

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

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

создаёшь локфайл, если создался работаешь, если не создался - ждёшь.

Линуксовые файловые блокировки вешь волшебная…

Dark_SavanT ★★★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария