/ / Вилка до або після прийняття з'єднань? - c, linux, unix, мережа

Вилка перед або після прийому з'єднань? - c, linux, unix, мережа

Наступний фрагмент коду створює 4 процеси, усі з яких використовують один і той же сокет.

Чи є якась небезпека робити це? Чи повинен я завжди мати один процес прослуховування та вилку після прийняття з'єднань, звичайним способом?

for (p = 0; p < 3; p++) {
pid = fork();
if (pid == 0) break;
}
while (1) {
unsigned int clientlen = sizeof(echoclient);
/* Wait for client connection */
if ((clientsock =
accept(serversock, (struct sockaddr *) &echoclient,
&clientlen)) < 0) {
die("Failed to accept client connection");
}
fprintf(stdout, "Process No. %d - Client connected: %sn",
p,
inet_ntoa(echoclient.sin_addr));
handle_client(clientsock);
}

(Я розумію, що форк після прийняття дозволяєпрограма для здійснення процесу для кожного з'єднання. Я граюся з прото-потоками та різними асинхронними матеріалами, тому я просто розглядаю наявність одного процесу на ядро.)

Відповіді:

10 за відповідь № 1

Ви можете зробити це в будь-який спосіб.

Як ви зауважили, форк після акцепту - одиндитина на клієнта / підключення. Форкінг перед акцептом (але після прослуховування) зазвичай називається попереднім форкінгом. Кожне з дітей чекає прийняття, і будь-яка дитина, яка отримує вхідне з'єднання, обробляє його. Це безпечно, доки прийняття здійснюється ядром, що (я думаю) робить будь-який сучасний unix. Якщо ні, вам доведеться поставити якийсь IPC (мьютекс тощо) навколо прийому. Перевагою попереднього розгалуження є те, що вам не потрібно витрачати витрати на вилку для кожного з'єднання, у вас вже є пул.