The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Как делать локи на C"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Как делать локи на C"
Сообщение от forfreeuse emailИскать по авторуВ закладки on 20-Янв-04, 14:22  (MSK)
Подскажите, чем правильно делать локи на Си под *nix?

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

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. " хотелось бы узнать, если общий подход для  >этого дела в *n..."
Сообщение от Lamr emailИскать по авторуВ закладки on 20-Янв-04, 14:56  (MSK)
Конечно есть! Только этот подход размером с книгу - чего тут можно в треде
насоветовать?

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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


  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. " хотелось бы узнать, если общий подход для  >этого дела в *n..."
Сообщение от forfreeuse emailИскать по авторуВ закладки on 20-Янв-04, 16:43  (MSK)
Спасибо, как раз к 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 пару страниц из книги
>где это на руском описанно.


  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. " хотелось бы узнать, если общий подход для  >этого дела в *n..."
Сообщение от solov Искать по авторуВ закладки on 20-Янв-04, 17:24  (MSK)
Что-бы много не писать шлю тебе на мыло 6 страниц где это с примером описанно.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. " хотелось бы узнать, если общий подход для>этого дела в *n..."
Сообщение от divan emailИскать по авторуВ закладки on 21-Янв-04, 13:35  (MSK)
Посмотри lock.c в исходниках fetchmail - там красиво реализовано.
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру