2009-10-14 23 views
8

Aşağıdaki kod parçacığı, tümü aynı dinleme soketini paylaşan 4 işlem oluşturur.Bağlantıları kabul etmeden önce veya sonra çatal mı?

Bunu yaparken herhangi bir tehlike var mı? Bağlantının kabul edilmesinden sonra her zaman bir dinleme işlemine ve çatala mı ihtiyacım var?

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); 
} 

(I proto-parçacığı ve çeşitli zaman uyumsuz şeylerle etrafında oynuyorum. Kabul ettikten sonra çatallama bir program bağlantı başına bir işlem yapmaya izin verdiğini anlamak yüzden sadece çekirdek başına bir süreci olan bakıyorum .)

cevap

10

Her iki şekilde de yapabilirsiniz.

Dikkat ederseniz, kabulden sonra forking, müşteri/bağlantı başına bir çocuktur. Kabulden önce (ama dinlemeden sonra) forking genellikle forking öncesi olarak bilinir. Çocukların her biri kabulü bekler ve çocuk ne olursa olsun gelen bağlantı süreçlerini alır. Bu kabul, herhangi bir modern unix'in yaptığı (bence) çekirdek tarafından kabul edildiği sürece güvenlidir. Aksi takdirde, kabul etrafında bir çeşit IPC (muteks vb.) Kilitlemeniz gerekir. Önceden ayrılmanın avantajı, her bir bağlantı için bir çatalın masrafını görmenize gerek olmamasıdır, zaten mevcut bir havuzunuz var.

+0

TCP katmanında, kaputun arkasında bir tcp bağlantısı (aka ağaç yolu kolu titremesi) kabul etmek için thr çekirdek görevidir. Burada hiç bir IPC'ye ihtiyaç duyulmadığından emin oldum. SO üzerinde bir kişi nerede bir platorm biliyor mu? –

+6

Stevens'a göre, BSD türetilmiş çekirdekleri her zaman yaptı. Bazı eski SysV sistemleri bir kütüphanede kabul edildi ve kilitleme gerekiyordu. Şüpheli olan herkes eskiden bir üretim işletim sistemi işletiyor ama asla bilmeyeceğinizi düşünüyorum. – Duck

+0

Ön çatal kullanıyorsak, Linux'ta setsockopt (server_fd, REUSEPORT) gerekmiyor, değil mi? –

İlgili konular