реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> sem_wait, sem_timedwait, непонятка какая-то...
SM
сообщение Feb 7 2011, 21:19
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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 я "типа решил проблему", но это сопля какая-то. Хочется понять, что там на самом деле произошло.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Feb 8 2011, 09:20
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Скорей всего баг в ядре или glibc - судя по версии ядра что-то старое используется. Не пробовали на более свежих версиях ? Потом семафоры именованые или безымянные используете ? У безымяных есть один ньюанс - недостаточно в sem_init указывать поле pshared=1 для межроцессного взаимодействия, кроме этого сам семафор должен находиться в разделяемой памяти (shared memory) доступной любому процессу.

Цитата(SM @ Feb 8 2011, 00:19) *
Использую семафоры для обработки событий, источником которых могут быть разные процессы

Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2011, 09:35
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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 мне не годится по лицензионным соображениям.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Feb 8 2011, 09:51
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(SM @ Feb 8 2011, 12:35) *
Насчет версии - какую дают, ту и юзаю (CentOS 5.5), обновляю ядро, glibc и прочее с их репозитория. Я не любитель сам себе ядра собирать и потом еще их прикручивать.


Можно подумать что для запуска на другом ядре и glibc обязательно их устанавливать на своей рабочей системе - даже если у вас там вся контора на одинаковых центосах - виртуалку поставить не проблема с любым свежим дистрибутивом. По крайней мере будете знать - ваш это баг или системный.

Цитата
А может быть такое, что к моей .so линкуют какой-то не тот glibc/rt, который я ожидаю?


man ldd
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2011, 10:06
Сообщение #5


Гуру
******

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



Цитата(sasamy @ Feb 8 2011, 12:51) *
man ldd

Гы. Спасибо sm.gif sm.gif. А я типа не знал...

меня интересует другой вопрос - есть ли механизм какой-то, который бы сделал так, что в реальной жизни будут прилинкованы не те либы, которые показывает ldd, при том что подлинковка происходит из процесса, пущенного не из-под скрипта, который мог бы окружение переделать, и не из-под дочернего процесса (с теми же опасностями), но не при загрузке исполняемого модуля, а по dlopen. Короче, можно ли как-то подменить либы без кореженья окружения?
Go to the top of the page
 
+Quote Post
sasamy
сообщение Feb 8 2011, 11:15
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(SM @ Feb 8 2011, 13:06) *
Гы. Спасибо sm.gif sm.gif. А я типа не знал...


пжлст, только если знаете зачем было задавать глупый вопрос ?

Цитата
Короче, можно ли как-то подменить либы без кореженья окружения?


Может лучше попробовать System V IPC для начала вместо Posix семафоров ?
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2011, 16:37
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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... Я почему-то отмел эту попытку после того, как без толку переписал с безымянных на именованные. Пожалуй попробую.
Go to the top of the page
 
+Quote Post
ObitJr
сообщение Feb 10 2011, 10:52
Сообщение #8


Участник
*

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



C помощью dlsym и LD_PRELOAD можно подменить функции любой либы.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 08:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016