Не помогают не ftrylockfile и не O_EXCL
От: nimdator  
Дата: 16.12.04 15:29
Оценка:
Уважаемые модераторы, пожалуйста, оставьте тему хотя бы на неделю.

Все просто. один процесс создает файл, другой должен дождаться
сладкого момента финала и скопировать этот файл.
Вопрос: как определить, что этот файл уже сделан?
Средства — С, ОС — Солярис.

Делаю тест:

/* test.c */
int main () {

        char* src_path="TEMP/ttt.txt";
        FILE* iop;
        int fildes;

        fildes=open(src_path, O_EXCL || O_WRONLY);
        printf("fildes = %d\n", fildes);

        close(fildes);
        iop=fopen(src_path,"w");
        fildes=ftrylockfile(iop);
        printf("fildes = %d\n", fildes);
        fclose(iop);

        return 0;
}


Затем

$> dd if=/dev/zero of=TEMP/ttt.txt bs=1 count=1000000 &
$> test
fildes = 3
fildes = 0
$>


То есть ни O_EXCL ни ftrylockfile не показали, что файл уже кем-то занят,
и в него что-то пишется. А как же это узнать?
Поиск не помог, так как в результате долгих копаний по форумам были предложены только эти два варианта.
Вдруг, кто-то знает третий?
Re: Не помогают не ftrylockfile и не O_EXCL
От: aka50 Россия  
Дата: 16.12.04 15:43
Оценка:
Здравствуйте, nimdator, Вы писали:

N>Уважаемые модераторы, пожалуйста, оставьте тему хотя бы на неделю.


N>То есть ни O_EXCL ни ftrylockfile не показали, что файл уже кем-то занят,

N>и в него что-то пишется. А как же это узнать?
N>Поиск не помог, так как в результате долгих копаний по форумам были предложены только эти два варианта.
N>Вдруг, кто-то знает третий?

Все правильно... если "писатель" не использует O_EXCL или flock, то
никаких локов (как в Win например) по умолчанию не ставиться...
надо смотреть что делает "писатель". Либо ждать его завершения,
если это возможно, либо поступать как tail и угадывать момент завершения
записи.
Re: Не помогают не ftrylockfile и не O_EXCL
От: nimdator  
Дата: 20.12.04 12:05
Оценка:
Господа, дело в том, что юниксовая cp не использует ни O_EXCL ни flock. Во всяком случае, тест на ней показал тот же результат, что и для dd. Эта cp используется писателем, отучить писателя от нее возможности нет, так как это сторонний разработчик и прочее. Есть ли еще какие-то варианты для решения этой проблемки?
Re[2]: Не помогают не ftrylockfile и не O_EXCL
От: aka50 Россия  
Дата: 20.12.04 12:45
Оценка:
Здравствуйте, 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.
Re: Не помогают не ftrylockfile и не O_EXCL
От: Murr Россия  
Дата: 25.12.04 01:38
Оценка:
Здравствуйте, nimdator, Вы писали:

N>То есть ни O_EXCL ни ftrylockfile не показали, что файл уже кем-то занят,

N>и в него что-то пишется. А как же это узнать?
N>Поиск не помог, так как в результате долгих копаний по форумам были предложены только эти два варианта.
N>Вдруг, кто-то знает третий?

Если файл не исчезает после создания, то проблему можно разделить на две части:
1) обнаружение того, что в директории возник новый файл
2) обнаружение того, что создатель его закрыл

Обе части решаются примерно одинаково, если говорить о конкретных реализациях,
то по первой части это может быть fam, а по второй можно посмотреть реализацию
lsof (вероятно, через kvm).
Re[2]: Не помогают не ftrylockfile и не O_EXCL
От: nimdator  
Дата: 27.12.04 12:06
Оценка:
Здравствуйте, Murr, Вы писали:

M>Здравствуйте, nimdator, Вы писали:


M>Если файл не исчезает после создания, то проблему можно разделить на две части:

M>1) обнаружение того, что в директории возник новый файл
M>2) обнаружение того, что создатель его закрыл

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

M>то по первой части это может быть fam, а по второй можно посмотреть реализацию
M>lsof (вероятно, через kvm).

Это значит kvm библиотеку подключать?
Но вот интересно — в маздае O_EXCL работает. В Солярке нет
Я собственно удивлен, как верующий заставший Бога, справляющим нужду,
это зачем-то был нужно или какая-то недочет в системе?
Re[3]: Не помогают не ftrylockfile и не O_EXCL
От: Murr Россия  
Дата: 27.12.04 13:27
Оценка:
Здравствуйте, 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>это зачем-то был нужно или какая-то недочет в системе?
Re[4]: Не помогают не ftrylockfile и не O_EXCL
От: nimdator  
Дата: 29.12.04 08:41
Оценка:
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.