Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6302
Последний выпуск: 19.06.2015

Непонятки с fork() в UNIX.....

254
03 ноября 2002 года
Cker
341 / / 20.08.2000
Имеется следующий код:

//Код, подготовливающий сокет, для прослушивания подключений.
...
while (1)
{
bzero(&clnt_addr, sizeof(clnt_addr));
addrlen=sizeof(clnt_addr);

CSocket=accept(SSocket, (struct sockaddr *)&clnt_addr, &addrlen);
if (CSocket<0)
printf("Error accept()\n");
else
{
switch (fork())
{
case 0:
close(SSocket);
SomeFunc(CSocket, inet_ntoa(clnt_addr.sin_addr));
close(CSocket);
exit(0);
case -1:
printf("Error fork()\n");
default:
close(CSocket);
}
}
}

Примерное содержимое функции SomeFunc

int SomeFunc(....)
{
....

//блок А, по выполнению которого в любом случае в конце вызывается return 0

//блок Б, представляющий из себя бесконечный цикл

}


Ситуация 1:
Подключение 1 с выходом по блока А
Подключение 2 с выходом по блоку А
Все работает Ок.

Ситуация 2:
Подключение 1 с зацикливанием по блоку Б
Подключение 2 с зацикливанием по блоку Б
Все работает Ок.

Ситуация 3:
Подключение 1 с зацикливанием по блоку Б
Подключение 2 с выходом по блоку А
И вот в этой ситуации Подключение 1 продолжает работать, а больше никакие подключения не принимаются, как будто завершается основной процесс.
???

И еще непонятка:
Допустим, при подключении 1 выделяется сокет 4; затем при подключении 2 выделяется опять-же сокет 4. Почему так происходит? Хотя если убрать строки с close(CSocket), то при каждом подключении выделятся новый сокет.
2.7K
01 декабря 2002 года
xtester
2 / / 01.12.2002
Цитата:
Originally posted by Cker
Имеется следующий код:

...
И еще непонятка:
Допустим, при подключении 1 выделяется сокет 4; затем при подключении 2 выделяется опять-же сокет 4. Почему так происходит? Хотя если убрать строки с close(CSocket), то при каждом подключении выделятся новый сокет.



Думается, что раз сокет был закрыт - то система считает его свободным, и что тогда может ей помешать выделить для работы именно его (снова).

А если (что мне кажется неверным) close(CS) убрать, то при интенсивном коннекте - сокеты когда-нибудь кончатся :)))

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог