Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Вопрос к кодерам под Линух  (Прочитано 2209 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Tarik

  • Автор темы
  • Участник
  • *
  • Сообщений: 161
    • Просмотр профиля
Вопрос к кодерам под Линух
« : 13 Октября 2008, 14:17:57 »
Может кто-то сталкивался с семафорами под Линух.
Проблема простая. Используются семафоры не важно в каком ПО и как. При некорректном завершении ПО, семафоры не удаляются, как в Винде, а продолжают свое существование. Соответственно, при повторном запуске не имею доступа к засемафоренным картам, пока явно не удалить все используемые семафоры. Временно сделал программку, которая их удаляет. Я понимаю, ПО не должно некорректно завершаться. У меня консольный сервер, отлавливаю Ctr-C и обрабатываю корректное завершение. Почему-то не всегда это срабатывает, вопрос не об этом. Как настроить семафор, чтобы он удалялся автоматически? Все равно при зависании какой-либо проги не хочется, чтобы оставался мусор в системе.

З.Ы. man semget малоинформативен.

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: Вопрос к кодерам под Линух
« Ответ #1 : 13 Октября 2008, 14:38:11 »
[лирическое отступление]
ЕМНИП, в классическом системном программировании UNIX понятия "поток" не существует, а "параллельность" выполнения достигается при помощи форков. В такой модели семафор, время жизни которого ограничено временем жизни родительского процесса, практически бесполезен, т.к. родитель не управляет временем жизни дочерних процессов.
[/лирическое отступление]

думаю, лучшее решение - это при старте твоего сервера проверять, существует ли уже семафор и чистить.

ЗЫ темку бы лучше в "программирование" перенести

Оффлайн Tarik

  • Автор темы
  • Участник
  • *
  • Сообщений: 161
    • Просмотр профиля
Re: Вопрос к кодерам под Линух
« Ответ #2 : 13 Октября 2008, 15:02:15 »
Можно сделать и при старте сервера, но все-таки мне не нравится этот вариант, т.к. с картами может работать другое ПО, которое юзает те же семафоры.
Не важно, потоки или процессы (используется и то и другое), семафорить карты в любом случае нужно, иначе виснет РедХат.
В винде семафоры сами уничтожаются каким-то чудесным образом. Может самому как-то реализовать, обработать исключение в деструкторе.. Это гемор. Все равно прога может каким-то боком некорректно завершиться. Как при этом удалить семафоры?

Оффлайн asashnov

  • Участник
  • *
  • Сообщений: 114
    • Просмотр профиля
Re: Вопрос к кодерам под Линух
« Ответ #3 : 13 Октября 2008, 15:24:54 »
заводить какой-нибудь файлик (типа, /var/lock/my_package) и делать на него fcntl (LOCK)
наверное даже лучше сразу на полезные файлы (файл базы), если именно к ним хочется доступ разграничить.
такой лок снимается при завершении процесса сам.
Talk is cheap. Show me the code. (c) Linux Torvalds.

Оффлайн Tarik

  • Автор темы
  • Участник
  • *
  • Сообщений: 161
    • Просмотр профиля
Re: Вопрос к кодерам под Линух
« Ответ #4 : 13 Октября 2008, 16:07:42 »
Можно лочить файл устройсва, что в директории dev?
« Последнее редактирование: 13 Октября 2008, 17:15:07 от Tarik »

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: Вопрос к кодерам под Линух
« Ответ #5 : 13 Октября 2008, 16:16:13 »
еще вариант - завести guardian для своего сервера. Т.е. запускается процесс, который запускает твой сервер (форкает, например), и больше ничего не делает - ждет завершения форкнутого процесса. Когда тот завершается - закрывает семафор / делает-то-че-там-еще-надо и выходит.

ЗЫ Хотя вообще-то по идее guardian его должен был бы перезапустить

Оффлайн Tarik

  • Автор темы
  • Участник
  • *
  • Сообщений: 161
    • Просмотр профиля
Re: Вопрос к кодерам под Линух
« Ответ #6 : 13 Октября 2008, 17:16:52 »
Это какая-то конкретная программа или просто написать процесс, кот запускает второй? Извращенский способ. Все накрутки - это не айс.

Еще раз поясню. Удалять семафоры в сервере не могу, т.к. может быть запущено другое ПО, работающее с картами, поэтому удаляется сейчас вручную. При корректном завершении сервера я открываю семафоры, но не удаляю. Почему так странно работает обработчик событий, я не разобрался. Надобно, чтоб как в винде удалялся семафор сам, как только умрут все его владельцы, не важно корректно или нет. Есть ли такая возможность в Линуксе вообще?
« Последнее редактирование: 13 Октября 2008, 17:23:44 от Tarik »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Вопрос к кодерам под Линух
« Ответ #7 : 14 Октября 2008, 15:18:53 »
Есть функция sem_unlink.
http://linux.die.net/man/3/sem_unlink
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн mkarasik

  • Участник
  • *
  • Сообщений: 163
    • Просмотр профиля
Re: Вопрос к кодерам под Линух
« Ответ #8 : 18 Октября 2008, 06:26:39 »
А если их удаление куда нибудь в сигналы прописать. На аборт там или на кил повесить. Мы что-то похожее ваяли как то. Но, вообще, вариант с ждущим процессом и форком тоже ничего.

Оффлайн Tarik

  • Автор темы
  • Участник
  • *
  • Сообщений: 161
    • Просмотр профиля
Re: Вопрос к кодерам под Линух
« Ответ #9 : 18 Октября 2008, 15:18:46 »
Все варианты катят, спасибо.  Значит семафоры автоматически не умирают, как я и думал.

 

Страница сгенерирована за 0.019 секунд. Запросов: 21.