Уважаемые модераторы, пожалуйста, оставьте тему хотя бы на неделю.
Все просто. один процесс создает файл, другой должен дождаться
сладкого момента финала и скопировать этот файл.
Вопрос: как определить, что этот файл уже сделан?
Средства — С, ОС — Солярис.
То есть ни O_EXCL ни ftrylockfile не показали, что файл уже кем-то занят,
и в него что-то пишется. А как же это узнать?
Поиск не помог, так как в результате долгих копаний по форумам были предложены только эти два варианта.
Вдруг, кто-то знает третий?
Здравствуйте, nimdator, Вы писали:
N>Уважаемые модераторы, пожалуйста, оставьте тему хотя бы на неделю.
N>То есть ни O_EXCL ни ftrylockfile не показали, что файл уже кем-то занят, N>и в него что-то пишется. А как же это узнать? N>Поиск не помог, так как в результате долгих копаний по форумам были предложены только эти два варианта. N>Вдруг, кто-то знает третий?
Все правильно... если "писатель" не использует O_EXCL или flock, то
никаких локов (как в Win например) по умолчанию не ставиться...
надо смотреть что делает "писатель". Либо ждать его завершения,
если это возможно, либо поступать как tail и угадывать момент завершения
записи.
Господа, дело в том, что юниксовая cp не использует ни O_EXCL ни flock. Во всяком случае, тест на ней показал тот же результат, что и для dd. Эта cp используется писателем, отучить писателя от нее возможности нет, так как это сторонний разработчик и прочее. Есть ли еще какие-то варианты для решения этой проблемки?
Здравствуйте, nimdator, Вы писали:
N>Господа, дело в том, что юниксовая cp не использует ни O_EXCL ни flock. Во всяком случае, тест на ней показал тот же результат, что и для dd. Эта cp используется писателем, отучить писателя от нее возможности нет, так как это сторонний разработчик и прочее. Есть ли еще какие-то варианты для решения этой проблемки?
самый тупой путь: написать свой cp (который будет лочить файлы и запускать оригинальный сp) и положить рядом с "писателем". Перед запуском
писателя проставить PATH=./:$PATH
Re: Не помогают не ftrylockfile и не O_EXCL
От:
Аноним
Дата:
20.12.04 12:52
Оценка:
N> fildes=open(src_path, O_EXCL || O_WRONLY);
не по теме, но здесь бага.
надо O_EXCL | O_WRONLY, иначе там будет просто 1.
Здравствуйте, nimdator, Вы писали:
N>То есть ни O_EXCL ни ftrylockfile не показали, что файл уже кем-то занят, N>и в него что-то пишется. А как же это узнать? N>Поиск не помог, так как в результате долгих копаний по форумам были предложены только эти два варианта. N>Вдруг, кто-то знает третий?
Если файл не исчезает после создания, то проблему можно разделить на две части:
1) обнаружение того, что в директории возник новый файл
2) обнаружение того, что создатель его закрыл
Обе части решаются примерно одинаково, если говорить о конкретных реализациях,
то по первой части это может быть fam, а по второй можно посмотреть реализацию
lsof (вероятно, через kvm).
Здравствуйте, Murr, Вы писали:
M>Здравствуйте, nimdator, Вы писали:
M>Если файл не исчезает после создания, то проблему можно разделить на две части: M>1) обнаружение того, что в директории возник новый файл M>2) обнаружение того, что создатель его закрыл
M>Обе части решаются примерно одинаково, если говорить о конкретных реализациях, M>то по первой части это может быть fam, а по второй можно посмотреть реализацию M>lsof (вероятно, через kvm).
Это значит kvm библиотеку подключать?
Но вот интересно — в маздае O_EXCL работает. В Солярке нет
Я собственно удивлен, как верующий заставший Бога, справляющим нужду,
это зачем-то был нужно или какая-то недочет в системе?
Здравствуйте, nimdator, Вы писали:
N>Здравствуйте, Murr, Вы писали:
M>>Здравствуйте, nimdator, Вы писали:
M>>Если файл не исчезает после создания, то проблему можно разделить на две части: M>>1) обнаружение того, что в директории возник новый файл M>>2) обнаружение того, что создатель его закрыл
M>>Обе части решаются примерно одинаково, если говорить о конкретных реализациях, M>>то по первой части это может быть fam, а по второй можно посмотреть реализацию M>>lsof (вероятно, через kvm).
N>Это значит kvm библиотеку подключать?
Значит стоит посмотреть исходники. Я не знаю, как lsof это делает для Solaris.
Знаю лишь то, что для Linux — это простой обход /proc. Но, в свое время читал,
что в Solaris (или SunOS?) для этих целей используется kvm.
N>Но вот интересно — в маздае O_EXCL работает. В Солярке нет
Погоди. O_EXCL судя по моему man означает лишь то, что файл не будет пересоздан.
Если программа плюет на блокировки, то advisory блокировки ничем не помогут.
mandatory блокировки, наверное, могут помочь в зависимости от их семантики в
каждом конкретном случае (для каждой конкретной ОС), но даже в тех случаях, когда
они есть они могут не предоставлять интерфейс вроде "поспать пока файл все закроют",
а лишь попытаться атомарно взять эксклюзивную блокировку и в случае неудачи сразу
выйти.
N>Я собственно удивлен, как верующий заставший Бога, справляющим нужду, N>это зачем-то был нужно или какая-то недочет в системе?
Здравствуйте, Murr, Вы писали:
M>Здравствуйте, nimdator, Вы писали:
N>>Но вот интересно — в маздае O_EXCL работает. В Солярке нет
M>Погоди. O_EXCL судя по моему man означает лишь то, что файл не будет пересоздан. M>Если программа плюет на блокировки, то advisory блокировки ничем не помогут. M>mandatory блокировки, наверное, могут помочь в зависимости от их семантики в M>каждом конкретном случае (для каждой конкретной ОС), но даже в тех случаях, когда M>они есть они могут не предоставлять интерфейс вроде "поспать пока файл все закроют", M>а лишь попытаться атомарно взять эксклюзивную блокировку и в случае неудачи сразу M>выйти.
Так и я об этом. В маздае cp блокирует создаваемый файл, в Солярке — нет.
Re: Не помогают не ftrylockfile и не O_EXCL
От:
Аноним
Дата:
29.12.04 09:31
Оценка:
В man open (в Linux) сказано, что O_EXCL ни коем случае нельзя использовать для блокировок, используйте лучше link.