![]() |
|
Модераторы: xvr |
![]()
|
|
| fish9370 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
предыстория: было у меня ядро, были у меня модули..
работал я с ними так: - запускал ядро, заходил в консоль и запускал модуль.. и все прекрасно работало.. но в один прекрасный день я сказал себе - а почему модули нужно запускать вручную? - и сделал автозагрузку.. и здесь у меня появилась проблема: почему-то при автозапуске, если в модуле открывается сокет, этот сокет оказывается кривым, переодически функция recvfrom возвращает сообщение об ошибке (Bad file descriptor). Все это происходит именно при форке, при запуске проги в режиме no-fork все работает как положено.. функция демонизации:
еще несколько замечаний: прога ведет лог, и вот что в этом логе странного:
где, tdns.c - это код модуля, basys.c - это код ядра при загрузке модуля, как и положено в unix, вызывается функция с символом _init (попросту говоря конструктор), который и вызывает функцию handler_start() - мы ее наблюдаем в логе но дальше мы видим вызов функции handler_stop(), которая вызывается из деструктора (выделил красным), но я ее не вызывал, при этом для модуля функцию dlclose я тоже не вызывал есть у кого-то хотябы предположения, что происходит? -------------------- undefined |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
||||
|
||||
| fish9370 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
спасибо xvr, что проявил интерес к проблеме,
я не совсем понял, что за пид нужен, напечатал так:
Добавлено через 3 минуты
вроде как открытые дескрипторы (то же касается и дескрипторов открытых либ?) передаются дочернему процессу и не закрываются, пока есть хоть один владелец? -------------------- undefined |
||||||
|
|||||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
сделал так:
и о чудо, сокет жив и работает, пока родительский процесс живет, xvr ты оказался прав.. но как выкручиваться из этой ситуации? -------------------- undefined |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
решил проблему, отложенной загрузкой модулей (после форка)
спасибо xvr, очень ценный ответ +1 -------------------- undefined |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Дескрипторы либ на самом деле не дескрипторы - они организуются на уровне пользователя динамическим линкером, и как они ведут себя при fork'е я лично не в курсе. По поводу сокетов - да, дескрипторы наследуются. Но для убиения сокета не обязательно закрывать его дескриптор, достаточно сделать shutdown на дескриптор (любой) и сокет помрет, не взирая на наличие любого количества других открытых дескрипторов |
|||
|
||||
| gormih |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 18.7.2007 Репутация: 1 Всего: 1 |
При fork любой процесс, у которого пропадают все процессы - родители попадает под базовый системный процесс init, который его успешно убивает (по задумке) А что с ним делать - другой вопрос... В вашей либе судя по всему формируется системный вызов exit(), который или превращает процесс в зомби, если на него не отреагировать, или дает родительскому процессу ( в.т.ч. init ) возможность перезапустить/убить процесс. Информация к размышлению так сказать Это сообщение отредактировал(а) gormih - 28.3.2013, 16:46 |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |