Как делать локи на C, forfreeuse, 20-Янв-04, 14:22 [смотреть все]Подскажите, чем правильно делать локи на Си под *nix?Нужно чтобы к одному ресурсу имела доступ одна копия программы, а остальные копии ждали. Пробовал сделать через семафоры - под линуксом работает, под фрей работает по другому, под некоторыми системами совсем не работает(на любую попытку работать с семафором выдает сообщение об ошибке, что Function not implemented). Сейчас думаю сделать через лок-файлы, хотелось бы узнать, если общий подход для этого дела в *nix?
|
- хотелось бы узнать, если общий подход для >этого дела в *nix?, Lamr, 14:56 , 20-Янв-04 (1)
Конечно есть! Только этот подход размером с книгу - чего тут можно в треде насоветовать?почитай У Стивенсон "Взаимодействие процессов" Замечательная книжка купить можно на piter.com
- хотелось бы узнать, если общий подход для >этого дела в *n..., forfreeuse, 15:09 , 20-Янв-04 (2)
Неужели что бы залочить файл нужна целая книга?>Конечно есть! Только этот подход размером с книгу - чего тут можно >в треде >насоветовать? > >почитай У Стивенсон "Взаимодействие процессов" >Замечательная книжка > >купить можно на piter.com
- хотелось бы узнать, если общий подход для >этого дела в *n..., solov, 16:26 , 20-Янв-04 (3)
Для блокировки файлов используется fcntl (System V and POSIX) #include <fcntl.h>int fcntl ( int fdesc, int cmd_flag, struct flock*); fdesc- дескриптор файла cmd_flag - F_SETLK блокирует файл F_SETLKW блокирует файл и вызывающий процес F_GETLK делает запрос о процессе, который блокировал struct flock { short l_type; какую блокировку снять или установить short l_whence; базовый адрес следующего поля off_t l_start; смещение относительно базового адреса off_t l_len; сколько байтов в заблокированной области pid_t l_pid; PID процесса } смотри ман. Eсли хочеш могу на мыло послать в jepg пару страниц из книги где это на руском описанно.
- хотелось бы узнать, если общий подход для >этого дела в *n..., forfreeuse, 16:43 , 20-Янв-04 (4)
Спасибо, как раз к fcntl приглядывался, правда никак рабочего примера не найду...А не подскажите, на сколько операции атомарные? нужна конструкция вида: if (блокировка_установленна) { if (блокировка_создана больше чем 30 сек назад) { снять блокировку; начать сначала; } else { ждать снятия блокировки, затем сделать что-то; } } else { установит_блокировку; сделать дело; снять_блокировку; } Есть вероятность что между проверкой блокировки и установкой блокировки кто-то влезет и поставит свою блокировку... Можно ли при помощи fcntl как-то это контролировать? >Для блокировки файлов используется fcntl (System V and POSIX) >#include <fcntl.h> > >int fcntl ( int fdesc, int cmd_flag, struct flock*); > >fdesc- дескриптор файла >cmd_flag - F_SETLK блокирует файл > > F_SETLKW блокирует файл и вызывающий процес > > F_GETLK делает запрос о процессе, который блокировал > >struct flock >{ > short l_type; какую блокировку снять или установить > short l_whence; базовый адрес следующего поля > off_t l_start; смещение относительно базового адреса > off_t l_len; сколько байтов в заблокированной области > pid_t l_pid; PID процесса >} > >смотри ман. >Eсли хочеш могу на мыло послать в jepg пару страниц из книги >где это на руском описанно.
|