The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Как делать локи на 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 пару страниц из книги
          >где это на руском описанно.




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

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