Могут ли дескрипторы файлов сокетов передаваться дочерним процессам? - PullRequest
0 голосов
/ 14 ноября 2018

Я сейчас пишу программу, и это многопроцессорное серверное приложение.Моя текущая идея заключается в том, что для каждого входящего TCP-соединения я принимаю его и передаю дескриптор входящего socet дочернему процессу, созданному с помощью fork ().Является ли дескриптор сокета одинаковым в обоих процессах или может произойти неопределенное поведение?Кажется, я могу читать из входящего сокета, но не записывать в него.

1 Ответ

0 голосов
/ 14 ноября 2018

От Человек принимает Акцент мой:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

В случае успеха эти системные вызовы возвращают неотрицательное целое число, которое является дескриптор файла для принятого сокета.

С человек вилка акцент шахты:

  • Ребенок наследует копий из родительского набора открытых дескрипторов файлов . Каждый дескриптор файла в дочернем элементе ссылается на то же описание открытого файла (см. Open (2)), что и соответствующий дескриптор файла в родительском элементе. Это означает, что два дескриптора совместно используют флаги состояния открытого файла, смещение текущего файла и управляемые сигналом атрибуты ввода / вывода (см. Описание F_SETOWN и F_SETSIG в fcntl (2)).

Каждое принятое соединение, открытое в parent / server, будет точно таким же в child. Было бы странно, если бы ваш ребенок не мог написать ему.

Обычно сервер выглядит так:

while (..) {
     int newconnection = accept(..);
     switch (fork()) {
     case 0:
         child_handle_connection(newconnection);
         break;
     ...
     }
     close(newconnection);
     ....
 }

Сравнение: первый результат, полученный мной от Google на примере http-сервера C, приводит к этому исходному файлу .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...