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
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ı. –
'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. –