2009-10-14 13 views
8

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 .)

risposta

10

Puoi farlo in entrambi i modi.

Come si nota, la biforcazione dopo l'accettazione è di un figlio per client/connessione. Forking prima dell'accettazione (ma dopo l'ascolto) è generalmente noto come pre-forking. Ognuno dei bambini aspetta sull'accettazione e qualsiasi bambino ottiene la connessione in ingresso lo elabora. Questo è sicuro fino a quando l'accettazione è fatta dal kernel che (credo) qualsiasi unix moderno fa. In caso contrario, è necessario inserire un tipo di blocco IPC (mutex, ecc.) Attorno all'accettazione. Il vantaggio del pre-forking è che non è necessario passare attraverso la spesa di una forcella per ogni connessione, si dispone già di un pool esistente.

+0

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'è? –

+6

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

+0

Non abbiamo bisogno di setsockopt (server_fd, REUSEPORT) su Linux se usiamo il pre-fork, giusto? @Duck –

Problemi correlati