2013-10-01 28 views
11

Bunun 24 süreç oluşturduğuna inanıyorum; ancak doğrulamaya ihtiyacım var. Bu sorular genellikle beni şaşırtıyor. Yardım için teşekkürler!Bu fork() ifadeleriyle kaç işlem oluşturulur?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(void) 
{ 
    pid_t pid = fork(); 
    pid = fork(); 
    pid = fork(); 
    if (pid == 0) 
    { 
    fork(); 
    } 
    fork(); 
    return 0; 
} 
+2

koyun Printf yılların yeni dizi, daha sonra derlemek ve çalıştırmak ve göreceksiniz. –

cevap

22

Bu yoluyla ikna etmeye oldukça kolaydır. fork çağrısı, her yürütüldüğünde ek bir işlem oluşturur. Çağrı, yeni (çocuk) işlemde 0 ve orijinal (ebeveyn) işleminde çocuğun işlem kimliği (sıfır değil) döndürür.

pid_t pid = fork(); // fork #1 
pid = fork();  // fork #2 
pid = fork();  // fork #3 
if (pid == 0) 
{ 
    fork();   // fork #4 
} 
fork();    // fork #5 
  1. Çatal 1. ek süreçlerini oluşturur. Artık iki sürecin var.
  2. Çatal # 2, iki işlemle, iki işlemle, toplam dört için yürütülür.
  3. Çatal # 3, dört işlemle, toplam sekiz için dört işlem gerçekleştirilir. Bunların yarısı pid==0 var ve yarım pid != 0
  4. Çatal 4. çatal 3. yarattığı süreçlerin yarı yarıya yürütülür var (yani dördü). Bu dört ek süreç oluşturur. Artık on iki sürecin var.
  5. Çatal # 5, kalan on iki işlem tarafından yürütülür ve on iki işlem daha gerçekleştirilir; şimdi yirmidört var.
+7

'çatal()' da -1' 'dönen başarısız olabilir, bu yüzden muhtemelen 'artık' den 24 süreçler, 'tam olarak' 24. – mbaitoff

+2

müthiş değil bulunduğunu ifade olabilir: D, bir öğretmen olmalıdır. – roottraveller

1

Siz haklısınız. 24. Henüz derlenmiş ve son dönüş ifadesinden önce print/printf ile çalıştırılmıştır. 24 satır çıktı var.

2

bu şekilde hesaplayın: 1 (Ana Süreci) ile

Başlangıç ​​ve (pid == 0) başka akımın 1/2 eklerseniz çatal içeride değilse her çatal için iki kez yapmak mevcut işlem sayısı.

Kodunuzda: 1P Geçerli # 1 fork() işlem sayısını iki katına çıkarın. Şimdi sürecin yeni numara 2P

Got 2. çatal() böylece süreçlerin mevcut sayısını ikiye katlayın. Şimdi sürecin yeni numara 4P

Got 3. çatal() böylece süreçlerin mevcut sayısını ikiye katlayın. Şimdi yeni bir sürecin sayısı 8P

Got 4. çatal() ama durum o kadar (8 + 4 = 12) p

Got 5. çatal() böylece süreçlerin mevcut sayısını ikiye katlamak eğer öyle bekleyin. Şimdi içine süreç 24P

İlgili konular