Il seguente snippet di codice crea 4 processi, tutti che condividono lo stesso socket di ascolto.Forchetta prima o dopo aver accettato le connessioni?
C'è qualche pericolo in questo? Devo sempre avere un processo di ascolto e una forchetta dopo aver accettato le connessioni, nel modo convenzionale?
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: %s\n",
p,
inet_ntoa(echoclient.sin_addr));
handle_client(clientsock);
}
(Capisco che si biforcano dopo aver accettato consente a un programma di fare un processo per ogni connessione. Sto giocando intorno con proto-fili e varie cose asincrona, quindi mi sto solo guardando avere un unico processo per core .)
Anche se è necessario che il kernel esegua una connessione TCP dietro il cofano (ovvero il maneggiamento del manico dell'albero) nel livello TCP. Ero sicuro che nessun tipo di IPC fosse necessario qui. Qualcuno su SO conosce un platorm dov'è? –
Secondo Stevens, i kernel derivati da BSD lo hanno sempre fatto. Alcuni vecchi sistemi SysV implementati accettano in una libreria e il blocco era richiesto. È dubbio che qualcuno stia utilizzando un sistema operativo di produzione così vecchio, ma suppongo che tu non lo sappia mai. – Duck
Non abbiamo bisogno di setsockopt (server_fd, REUSEPORT) su Linux se usiamo il pre-fork, giusto? @Duck –