2016-03-26 34 views
0
char array[ARRAY_SIZE]; 

void child_process_routine(){ 
int j; 
    for(j = 0;j<ARRAY_SIZE;j++) 
    array[j]='d'; 
} 

main() 
{ 
    pid_t child_pid; 
    int i; 
    for(i = 0;i<ARRAY_SIZE;i++) 
    array[i]='c'; 
    child_pid = fork(); 

     switch (child_pid) { 
     case -1: 
      perror("error");  
      exit(1); 
     case 0: 
      child_process_routine(); 
      exit(0);  
     default: 
      wait(NULL); 
     } 

    print_array(array); 
} 

Üst süreç alt süreç beklemez ve bu yine bana çıktı "cccccc" verir neden beni açıklayabilir? Çocuk işleminde "dddddd" olarak değiştirildiÜst süreç çocuk süreç (c kodu) beklemez

Bekleme (NULL) bile ne yapar?

Çocuk sürecini beklemesi gerektiğini nasıl bilmesi gerekiyor?

+0

Çocuk, ebeveynin adres alanının bir kopyasını alır. Dizi [] 'deki değişiklikler sadece çocuğun kopyasına yapılır, ebeveynin kopyası değiştirilmeden kalır. İşletim sisteminize bağlı olarak, değişikliklerin her iki işlemde de görülebileceği özel "paylaşılan" bellek elde edebilirsiniz. – EOF

cevap

0

Ana işlem , çocuk işlemini bekleyen dur.

Çocuğun bir iş parçacığı değil, kendi PID'si ve ana PID'si olarak ana ile tamamen farklı bir süreçtir. Çocuk ve ebeveyn aynı diziyi paylaşmazlar, çocuğun kendi kopyası vardır, çünkü farklı bir süreçtir (aynı sürecin bir parçası değildir). Böylece, diziyi çocukta 'd' olarak ayarladığınızda, üst işlemdeki diziyi etkilemez.

Çıkmadan hemen önce alt işlem akışına bir uyku (20) koymayı ve ana bekle() öğesinden hemen önce bir printf() koymayı deneyin. Uygulamanın, ebeveynin çocuğun bitirmesini beklediğinden durakladığını göreceksiniz.

+0

Evet, global değişkenin ebeveynler ve çocuklar arasında paylaşılacağını varsaydım. Cevaplarınız için hepinize teşekkür ederim. soru, ebeveynin güncelleştirilmiş diziyi yazdırmasını kesinlikle istiyor, bunun nasıl gerçekleştirileceğine dair herhangi bir fikir var mı? –

+0

Ebeveynin çocuğun neyin peşinde olduğunu bilmesi gerekiyorsa, aralarında bir boru açmanız ve çocuğun ebeveynle konuşmasını sağlamanız gerekir. –

0

fork() farklı bir işlem oluşturur, ancak üst öğe aynı işlem içeriğini paylaşır.

Ancak, ebeveyn yığın kümesindeki herhangi bir şeyi değiştirmeye çalışırsanız, bunun bir kopyasını oluşturur ve alt işlem için ayrı bir yığın oluşturur, ancak veri parçası, kod parçası vb. Gibi tüm kaynaklar alt işlem için kopyalanmaz. . İkisi de paylaşıyor.

çatal sonra veri değiştirme konusunda bu kopyalama çocuk süreç bitmesini

Veli süreci bekliyor "yazma sırasında kopyalama" denir. Ancak hem ebeveyn hem de çocuk için ayrı ayrı ve her ikisi için farklı veriler ve farklı veriler için hem