2016-11-30 4 views
0

Моя домашняя задача - написать программу на языке C, которая создает 4 дочерних процесса, и каждый ребенок должен что-то делать с целым числом и отправить его следующему ребенку, который делает что-то еще с он и последний должны напечатать измененное значение. Я должен использовать анонимные каналы для общения между детьми. У родительского процесса нет другой работы, кроме как открыть трубы для детей. Я написал программу, но проблема в том, что я получаю смешной вывод, когда пытаюсь напечатать номер с использованием последнего ребенка. Он печатает 8 чисел вместо одного (фактически один из них является правильным). Часть кода имеет следующий вид:Использование труб для передачи данных между дочерними процессами в C

int pipe1[2]; 
int pipe2[2]; 
int pipe3[2]; 
pipe(pipe1); 
pipe(pipe2); 
pipe(pipe3); 

int j; 

close(pipe1[1]); //close pipes for writing on parent process 
close(pipe2[1]); 
close(pipe3[1]); 

for (j = 0; j < 4; j++) { 
    switch(fork()) { 
    case 0: 
     if (j == 0) { 
      int value = 100; 
      write(pipe1[1], &value, sizeof(int)); 
      close(pipe1[1]); 
     } 
     else if (j == 1) { 
      int value; 
      read(pipe1[0], &value, sizeof(int)); 
      close(pipe1[0]); 
      value = value * 10; 
      write(pipe2[1], &value, sizeof(int)); 
      close(pipe2[1]); 
     } 
    //and so on until the last process 
     else if (j == 3) { 
      int value; 
      read(pipe3[0], &value, sizeof(int)); 
      char buf[4] = {0}; 
      memset(buf, 0, sizeof(buf)); 
      snprintf(buf, sizeof(value), "%d ", value); 
      write(1, buf, strlen(buf)); 
     } 
     break; 
    } 
} 
close(pipe1[0]); 
close(pipe2[0]); 
close(pipe3[0]); 
sleep(1); 

int k; 

for (k = 0; k < 4; k++) { 
    wait(0); 
} 

Что я должен сделать для этого случая, только чтобы получить один (и правильный) один выход?

+0

Вам нужен buf [5], я думаю, если int на вашем компьютере длиной 4 байта. – MayurK

ответ

1

Как вы считаете, когда один из ваших дочерних процессов выполняет оператор break в коде, который вы представили? Подсказка: он не выходит.

Кроме того, я сомневаюсь, что ваши трубы могут работать так. Вы закрываете концы записи из двух из них (один из них дважды) до раздвоение любых детей. Они не будут волшебным образом возобновлены для детей, поэтому их целые трубы бесполезны.

+0

Извините, я отредактировал код ... Я закрыл (pipe3 [1]). Поэтому мне не следует закрывать трубы перед корпусом коммутатора и в каждом операторе if мне нужно _exit (0) в конце? – Luki

+0

@Luki, Родитель не должен закрывать свою копию любого конца трубы перед тем, как развернуть всех детей, которые должны использовать этот конец трубы. Избегайте всех замыканий до тех пор, пока цикл не станет простым способом для этого. Вам необходимо обеспечить, чтобы каждый ребенок выходил, когда он завершил свою предполагаемую работу; поместить '_exit (0)' в каждый из блоков 'if' было бы одним из способов добиться этого. –

+0

Я решил это :) Спасибо за очень четкий ответ. – Luki

Смежные вопросы