2016-03-31 21 views
0

Yani ebeveyn süreci ve 5 çocuk süreçleri var. Ebeveynin çocuk 1 ile iletişim kurmasını istiyorum, çocuk 2 ile çocuk 1, ... ebeveynle birlikte çocuk 5. Çocuğun 5'ten ebeveyn sürecine -Son çocuktan ebeveyne bir borudan nasıl bir sayı gönderilir?

Geçen bağlantısından dışındaki tüm çocuk ile iletişim kurabilir değilim.

Burada oğul için 5'e ebeveyn için 0 ve 1 dönen çatal() kullandığınız yere BabyMaker olduğunda benim kod

int main(void){ 
pid_t child[CHILDS+1]; 
int aux = 0, id, i, num, pipes[CHILDS][2]; 

for(i = 0; i < CHILDS +1; i++){ 

    if((pipe(pipes[i])) == -1){ 
     perror("Pipe failed"); 
     return 1; 
    } 
} 

id = babyMaker(child); 

srand((unsigned) getpid()); 
num = rand() % 50 + 1; 

if(id == 0){ 
    printf("Parent number: %d\n", num); 
    close(pipes[i][0]); 
    close(pipes[CHILDS][1]); 

    for(i = 0; i < CHILDS; i++){ 
     if(i != id){ 
      close(pipes[i][0]); 
      close(pipes[i][1]); 
     } 
    } 

    write((pipes[0][1]), &num, sizeof(int)); 
    close(pipes[0][1]); 


    read(pipes[CHILDS][0], &aux, sizeof(int)); 

    while(wait(NULL) > 0); 

    close(pipes[CHILDS][0]); 

    if(aux > num){ 
     num = aux; 
    } 

    printf("Greatest number: %d\n", num); 

}else{ 
    close(pipes[id-1][1]); 
    close(pipes[id][0]); 

    for(i = 0; i < CHILDS; i++){ 
     if(i != id && i != id-1){ 
      close(pipes[i][0]); 
      close(pipes[i][1]); 
     } 
    } 

    printf("Child %d with number: %d\n",id, num); 

    read((pipes[id-1][0]), &aux, sizeof(int)); 
    close(pipes[id-1][0]); 

    if(num < aux){ 
     num = aux; 
    } 

    write((pipes[id][1]), &num, sizeof(int)); 
    close(pipes[id][1]); 

    printf("\nChild %d received the number: %d\n", id, aux); 
    exit(id); 
} 

return 0; 
} 

bu.

CHILDS başlığına sadece tanımlanmış bir değişkendir.

Ben çocuk üzerindeki sayı Alınan birden büyük ve eğer öyleyse göndermek olup olmadığını kontrol etmek istiyorum. Bu işlemin orijinal numarasını göndermezseniz. Ebeveyn en çok sayıdaını yazdırır.

ben anlamaya çalışıyordum ama ben eksik bulamıyor. Daha fazla bilgiye ihtiyacın olursa haberim olsun.

Düzenleme 1: Kodu çalıştırmak için uygun olabileceğinden, burada babyMaker ve başlık dosyası.

BabyMaker

int babyMaker(pid_t *child){ 
int i; 

for(i = 0; i < CHILDS; i++){ 
     if((child[i] = fork()) == 0){ 
      return i+1; 
     } 
    } 
return 0; 
} 

kafa dosyası

#ifndef HEAD_H 

#define HEAD_H 

#include <stdio.h> 
#include <stdlib.h> 
#define CHILDS 5 

#endif 

ana üzerinde #include "head.h" ekleyin ve her şey bu hat için

+0

Senin sorunun esasen [Çatallanan ve C Boru Süreçler] (https aynıdır.com/sorular/19825489/çatallaşma-ve-boru-süreçler-in-c). Mevcut kodunuz elbette farklı. –

+0

'if (id == 0) { printf (" Ana numara:% d \ n ", num); kapatın (borular [i] [0]); 'i' '' CHILDS + 1 'değeridir, bu yüzden 'boru' dizisinin sınırlarına erişiyorsunuz ve' close() 'kapanmıyor kapatmak istediğin şeyi. Ben '0' olması gerektiğinden şüpheleniyorum. –

cevap

1

çalışması gerekir:

id = babyMaker(child); 

kimliği va sahip oluyor Bu hat anlamına gelmektedir 5.

1 ila lue:

close(pipes[id][0]); 

bu borular olarak tanımlanır çünkü geçersiz

close(pipes[5][0]); 

olabilir [5] [2]. Bu birebir hata.

Ayrıca, bu hatlar aynı nedenle geçersizdir:

int aux = 0, id, i, num, pipes[CHILDS][2]; 
:
close(pipes[CHILDS][0]); 

close(pipes[CHILDS][1]); 
read(pipes[CHILDS][0], &aux, sizeof(int)); 
Belki bu çizgiyi demek

bu olması: // stackoverflow: Eğer programı ile çözmeye çalışıyoruz

int aux = 0, id, i, num, pipes[CHILDS+1][2]; 
+0

Cevabınız için teşekkürler! Sorumu son hattınızla cevaplasan da, neden diğer bölümün yanlış olduğunu anlamıyorum. kimliği, 0 ile 5 arasında bir değer olacaktır, çünkü üst işlem için 0 değerini döndürür. Ayrıca, doğru işlemcinin bağlandığından emin olmalıyım ... kod şu anda borularla çalışıyor [CHILDS + 1] [2] ama diğer hatların neden doğru olmadığını anlayamadım. – AimForNuts

+0

Bir dizi "int borular [5]" olarak tanımlandığında, sadece borular [0], borular [1], borular [2], borular [3] ve borular [4] geçerlidir. Borulara [5] da erişmeye çalışıyordunuz. – contrapants

+0

"pid_t alt öğesi [CHILDS + 1];" yerine "pid_t çocuk [CHILDS];" – contrapants

İlgili konular