Подскажите, чем правильно делать локи на Си под *nix?Нужно чтобы к одному ресурсу имела доступ одна копия программы, а остальные копии ждали.
Пробовал сделать через семафоры - под линуксом работает, под фрей работает по другому, под некоторыми системами совсем не работает(на любую попытку работать с семафором выдает сообщение об ошибке, что Function not implemented).
Сейчас думаю сделать через лок-файлы, хотелось бы узнать, если общий подход для этого дела в *nix?
Конечно есть! Только этот подход размером с книгу - чего тут можно в треде
насоветовать?почитай У Стивенсон "Взаимодействие процессов"
Замечательная книжкакупить можно на piter.com
Неужели что бы залочить файл нужна целая книга?>Конечно есть! Только этот подход размером с книгу - чего тут можно
>в треде
>насоветовать?
>
>почитай У Стивенсон "Взаимодействие процессов"
>Замечательная книжка
>
>купить можно на piter.com
Для блокировки файлов используется 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 пару страниц из книги где это на руском описанно.
Спасибо, как раз к 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 пару страниц из книги
>где это на руском описанно.
Что-бы много не писать шлю тебе на мыло 6 страниц где это с примером описанно.
Посмотри lock.c в исходниках fetchmail - там красиво реализовано.