|
|
  |
sem_wait, sem_timedwait, непонятка какая-то... |
|
|
|
Feb 7 2011, 21:19
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Речь о не-ембеддед, просто линукс, 2.6.18-194.32.1.el5
Мне вот непонятно кое что... Использую семафоры для обработки событий, источником которых могут быть разные процессы, одним процессом. Суть в том - создаю два семафора - "Start" и "Complete", у обоих начальное значение ноль. Процесс-сервер в sem_wait ждет семафора "start". Клиент подготавливает данный в shared memory, и постит start, после чего ждет complete. Сервер, дождавшись start-а, делает свое дело, и постит complete. Клиент идет дальше.
А глюк очень странный - тестовый "клиент" всегда работает четко, не удалось его повесить. А вот реальный клиент, а это процесс, который добирается до моей функции через целый слой shared object-ов (динамически подключаемых библиотек), умудряется наглухо вешаться в sem_wait для семафора "completed", при том, что гарантированно известно, что сервер запостил его, и семафор имеет значение 1. И, самое глючное, что при замене sem_wait на sem_timedwait с таймаутом в 10 секунд и в бесконечном цикле до тех пор, пока не дождется, все начинает работать идеально и даже не тормозит...
Вопрос: что бы это все значило? Каким макаром можно повлиять на процесс так, чтобы sem_wait не "развис" после sem_post, при этом сохраняя нормальную работу sem_timedwait? Я, конечно, понимаю, что поставив sem_timedwait я "типа решил проблему", но это сопля какая-то. Хочется понять, что там на самом деле произошло.
|
|
|
|
|
Feb 8 2011, 09:35
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
И именованные (sem_open, semget не пробовал), и безымянные, ведут себя одинаково. Про то, что безымянные в shm должны лежать, я в курсе. Если безымянные положить не в shm - тут никакой timedwait не поможет. Да и на поверку - именованный семафор это безымянный, лежащий в /dev/shm/sem.<name>
Насчет версии - какую дают, ту и юзаю (CentOS 5.5), обновляю ядро, glibc и прочее с их репозитория. Я не любитель сам себе ядра собирать и потом еще их прикручивать.
насчет бага в glibc - скорее в rt - я пожалуй гляну в ее сырцы.
А может быть такое, что к моей .so линкуют какой-то не тот glibc/rt, который я ожидаю? При том, что запуск того исполняемого модуля, который меня к себе подлинковывает, происходит не через скрипт, то есть переменные окружения некому попоганить? Статическая линковка glibc/rt мне не годится по лицензионным соображениям.
|
|
|
|
|
Feb 8 2011, 09:51
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(SM @ Feb 8 2011, 12:35)  Насчет версии - какую дают, ту и юзаю (CentOS 5.5), обновляю ядро, glibc и прочее с их репозитория. Я не любитель сам себе ядра собирать и потом еще их прикручивать. Можно подумать что для запуска на другом ядре и glibc обязательно их устанавливать на своей рабочей системе - даже если у вас там вся контора на одинаковых центосах - виртуалку поставить не проблема с любым свежим дистрибутивом. По крайней мере будете знать - ваш это баг или системный. Цитата А может быть такое, что к моей .so линкуют какой-то не тот glibc/rt, который я ожидаю? man ldd
|
|
|
|
|
Feb 8 2011, 10:06
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(sasamy @ Feb 8 2011, 12:51)  man ldd Гы. Спасибо  . А я типа не знал... меня интересует другой вопрос - есть ли механизм какой-то, который бы сделал так, что в реальной жизни будут прилинкованы не те либы, которые показывает ldd, при том что подлинковка происходит из процесса, пущенного не из-под скрипта, который мог бы окружение переделать, и не из-под дочернего процесса (с теми же опасностями), но не при загрузке исполняемого модуля, а по dlopen. Короче, можно ли как-то подменить либы без кореженья окружения?
|
|
|
|
|
Feb 8 2011, 11:15
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(SM @ Feb 8 2011, 13:06)  Гы. Спасибо  . А я типа не знал... пжлст, только если знаете зачем было задавать глупый вопрос ? Цитата Короче, можно ли как-то подменить либы без кореженья окружения? Может лучше попробовать System V IPC для начала вместо Posix семафоров ?
|
|
|
|
|
Feb 8 2011, 16:37
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(sasamy @ Feb 8 2011, 14:15)  пжлст, только если знаете зачем было задавать глупый вопрос ? Я спрашивал не про то, как посмотреть зависимости у модуля, а про то, не может ли быть такого, что моей либе подменили требуемые либы другими во время ее загрузки. Этим могло бы объясниться то, что поведение разное при разных вариантах запуска - мой тест это одно, работа из-под другой программы - другое. Цитата(sasamy @ Feb 8 2011, 14:15)  Может лучше попробовать System V IPC для начала вместо Posix семафоров ? В принципе вариант. Если, конечно, они не сходятся внутри на точно те же вызовы, что и posix... Я почему-то отмел эту попытку после того, как без толку переписал с безымянных на именованные. Пожалуй попробую.
|
|
|
|
|
Feb 10 2011, 10:52
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 23-07-05
Пользователь №: 7 043

|
C помощью dlsym и LD_PRELOAD можно подменить функции любой либы.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|