Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
phil
Зарегистрирован: 24.08.2003 Сообщения: 32 Откуда: Санкт-Петербург
|
Добавлено: Вс Авг 24 2003 18:19 Заголовок сообщения: закрытие сокета ( unix ) |
|
|
Есть, к примеру, такой код:
... s1 = accept( s, NULL, NULL ); s2 = dup( s1 ); shutdown( s1, SHUT_RDWR ); close( s1 ); ...
Вопрос вот в чем - почему после закрытия s1 нельзя обращаться к s2? Что при этом происходит?
Как я думаю, мы в shutdown просто закрываем канал, а толку от dup-енного дескриптора, если обращаться не к чему. Я прав?
Заранее спасибо. |
|
Вернуться к началу |
|
 |
and3008
Зарегистрирован: 12.10.2001 Сообщения: 14893 Откуда: Н.Новгород
|
Добавлено: Вс Авг 24 2003 19:57 Заголовок сообщения: Re: закрытие сокета ( unix ) |
|
|
Я маленько не понял кода, но что-то мне подсказывает, что тебе нужна копия некого экземпляра объекта. Так?
Ды делаешь его дубликат, потом уничтожаешь источник и не можешь обращаться к копии?
Все в общем-то логично. Вероятнее всего dup возвращает только ссылку на объект, а не сам объект. При уничтожении объекта теряет смысл обращаться к нему по ссылке, т.к. сам объект уничтожен и память освобождена. Любая приличная ОС при попытке обращения "не туда" выкидывает всех "желающих" из ОЗУ.
Ход мысли ясен? |
|
Вернуться к началу |
|
 |
phil
Зарегистрирован: 24.08.2003 Сообщения: 32 Откуда: Санкт-Петербург
|
Добавлено: Вс Авг 24 2003 21:44 Заголовок сообщения: Re: закрытие сокета ( unix ) |
|
|
Код, подобный этому должен выполняться на сервере. Т.е делаем дупликат дескриптора, а сам дескриптор закрываем и продолжаем принимать подключения. Получается, что shutdown там быть не должно, так?
Все это происходит в Линухе.
2 and3008: ну да, все вроде так. Просто интересно, что в действительности происходит. Может, знаешь куда смотреть в исходники оси, где это все? |
|
Вернуться к началу |
|
 |
and3008
Зарегистрирован: 12.10.2001 Сообщения: 14893 Откуда: Н.Новгород
|
Добавлено: Вс Авг 24 2003 22:24 Заголовок сообщения: Re: закрытие сокета ( unix ) |
|
|
Где смотреть - не знаю. Что происходит поясню.
Открывая дескриптор мы объяснем системе, что вот тут есть процесс, который отвечает за этот самый дескриптор.
Функция dup позволяет создать дополнительный указатель на дескриптор. Ну вроде как записать указатель на дескриптор в другую переменную. За истинность этого отвечать не берусь, но думаю что все именно так и происходит.
Закрыв дескриптор мы утрачиваем возможность работать с дескриптором и все указатели на него становятся недействительными.
Что же делать? Объясни что надо и желательно по-подробнее. Думаю решение лежит на поверхости, надо только взглянуть на проблемму под другим углом зрения.  |
|
Вернуться к началу |
|
 |
phil
Зарегистрирован: 24.08.2003 Сообщения: 32 Откуда: Санкт-Петербург
|
Добавлено: Пн Авг 25 2003 01:26 Заголовок сообщения: Re: закрытие сокета ( unix ) |
|
|
На самом деле просто не надо использовать shutdown, и все. Попробую сам поискать исходники - а то на словах-то оно конечно понятно, а что там на самом деле - неясно. Я тоже так думаю ( про дескриптор ) - уже писал. |
|
Вернуться к началу |
|
 |
|