URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2484
[ Назад ]

Исходное сообщение
"Как делать локи на C"

Отправлено forfreeuse , 20-Янв-04 14:22 
Подскажите, чем правильно делать локи на Си под *nix?

Нужно чтобы к одному ресурсу имела доступ одна копия программы, а остальные копии ждали.

Пробовал сделать через семафоры - под линуксом работает, под фрей работает по другому, под некоторыми системами совсем не работает(на любую попытку работать с семафором выдает сообщение об ошибке, что Function not implemented).

Сейчас думаю сделать через лок-файлы, хотелось бы узнать, если общий подход для этого дела в *nix?


Содержание

Сообщения в этом обсуждении
" хотелось бы узнать, если общий подход для  >этого дела в *nix?"
Отправлено Lamr , 20-Янв-04 14:56 
Конечно есть! Только этот подход размером с книгу - чего тут можно в треде
насоветовать?

почитай У Стивенсон "Взаимодействие процессов"
Замечательная книжка

купить можно на piter.com


" хотелось бы узнать, если общий подход для  >этого дела в *n..."
Отправлено forfreeuse , 20-Янв-04 15:09 
Неужели что бы залочить файл нужна целая книга?

>Конечно есть! Только этот подход размером с книгу - чего тут можно
>в треде
>насоветовать?
>
>почитай У Стивенсон "Взаимодействие процессов"
>Замечательная книжка
>
>купить можно на piter.com



" хотелось бы узнать, если общий подход для  >этого дела в *n..."
Отправлено solov , 20-Янв-04 16:26 
Для блокировки файлов используется 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 , 20-Янв-04 16:43 
Спасибо, как раз к 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 пару страниц из книги
>где это на руском описанно.



" хотелось бы узнать, если общий подход для  >этого дела в *n..."
Отправлено solov , 20-Янв-04 17:24 
Что-бы много не писать шлю тебе на мыло 6 страниц где это с примером описанно.

" хотелось бы узнать, если общий подход для>этого дела в *n..."
Отправлено divan , 21-Янв-04 13:35 
Посмотри lock.c в исходниках fetchmail - там красиво реализовано.