выбрать для чтения после вилки - PullRequest
1 голос
/ 23 февраля 2011

как выбрать для чтения обработку в системах Linux, если процесс был разветвлен после открытия сокета udp?Особенно - возможно ли, что в программе такого типа:

so = open socket
fork
for(;;) {
  select() for reading on socket so
  recv from so
}

два пакета разбудят только один из процессов (в случае, если они поступят до того, как ожидающий процесс будет уведомлен / завершен выбор), и второйиз этих пакетов не будут получены?

Или я могу предположить, что для UDP каждый пакет всегда будет вызывать процесс или оставлять установленный флаг?

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

Каждый процесс, родительский и дочерний, имеет дескриптор fie для одного и того же сокета.Атрибуты дескриптора для каждого файла независимы (например, блокировка, возможность закрытия сокета).

В вашем сценарии действительно допустимо, чтобы один из процессов, например, был активирован и считывал данные изсокет до того, как другой попадет в select.

0 голосов
/ 25 февраля 2011

На ваш вопрос вообще не влияет fork().

select() возвращает, если один из файловых дескрипторов в наборе для чтения доступен для чтения.Если вы не прочитаете его и снова не наберете select(), он все равно будет доступен для чтения.Он будет оставаться читаемым до тех пор, пока не будет больше данных для чтения из него.

Другими словами, select() запускается по уровню, а не по фронту.

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