Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под *nix > C++ на Unix
Перезагрузить страницу Accept возвращает -1, когда завершается дочерний
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
wildhare wildhare вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.12.2007
По умолчанию Accept возвращает -1, когда завершается дочерний - 05.01.2008, 01:50

процесс.

Есть код вида

Код:
bind...
listen...
while((h = accept(s, ...) != -1)
{
close(h);
Создаётся дочерний процесс
}
сокет блокирующий.

При завершении дочернего процесса accept возвращает -1.

Пытался после создания сокета выставить ему
fcntl(s, F_SETFD, FD_CLOEXEC)

безрезультатно.

Есть ли возможность обойти?
Ответить с цитированием
  (#2 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 05.01.2008, 09:06

Есть предположение, что дочерний процесс при завершении посылает сигнал SIGCHLD, который вызывает досрочное завершение accept. После того, как accept вернет -1, нужно проверить значение переменной errno (определена в errno.h). Если в ней - EINTR, значит ошибки не произошла, а системный вызов досрочно прерван сигналом и его просто нужно повторить.

Если не поможет - приведите полный код, который можно ввести в машину и увидеть описываемое Вами поведение.

И вообще, привыкайте вызывать perror после возникновения неожиданной ошибки - очень помогает.
Ответить с цитированием
  (#3 (permalink)) Старый
wildhare wildhare вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.12.2007
По умолчанию 05.01.2008, 15:19

Спасибо за ответ. Так оно в действительности и есть. В случае завершения дочернего процесса получаю EINTR, в случае собственного завершения блокирующего вызова через shutdown(s...) close(s) из другого потока получаю "invalid argument". Закономерности в появлении EINTR так и не выяснил. Иногда происходит, иногда нет.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не завершается установка win7 onegin44 Windows 7 12 04.03.2012 20:04
Записать на С# дочерний элемент в XML-файл Fill .NET 4 02.08.2011 21:07
Когда включаеш камп то вентиляторы крутятся быстро!А когда идет вход в систему замедл Ivanka007 Любые вопросы от новичков 2 11.01.2011 02:16
TThread, завершается Execute правильно ли сделано Elecstorm C++ Builder 3 08.11.2010 03:50
Компьютер стал перегружаться, когда раз в сутки, когда через каждые 5 минут. Станислав Любые вопросы от новичков 2 02.03.2010 12:42
Можно ли из DLL-библиотеки запустить дочерний процесс Maks1978 C++ Builder 5 13.01.2010 11:47
Во время перегрузки оператора постинкремента програма аварийно завершается teapot Visual C++ 3 06.03.2008 17:15
Как создать дочерний процесс terek Delphi 6 09.10.2006 14:53
Процессы как реализовать дочерний процесс vain С/С++ 22 17.03.2006 12:44
Что все-таки возвращает конструктор Slava KPSS С/С++ 13 03.11.2005 10:14
Как создать дочерний модальный диалог на С++ imported_Elka Вопросы начинающих программистов 13 09.04.2005 13:36
Есть созданный процессом дочерний CUI процесс как узнать требует ли он ввода данных Fess exe Visual C++ 1 17.10.2004 19:58



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов