2014-09-24 3 views
0

Итак, в моей программе пользователь дает три аргумента. Затем я перевожу его на троих детей.Каков правильный способ чтения из нескольких труб?

Двое детей все делают свои расчеты, а затем выходят. Последний ребенок отображает результаты.

Родитель ждет, пока все дети закончат, а затем просто прекратит выполнение программы.

Резюме того, что делают дети:

inputs are a, b, c. 
child0: c0 = a*b 
child1: c1 = b*c 
overview: printf("%d %d", c0, c1); 

Я не могу понять, как получить обзор на печать правильно. Он продолжает печатать странные поврежденные символы или коробки.

У кого-нибудь есть рекомендации относительно того, как это сделать правильно? Я прочитал книгу, но только подробно рассмотрел отдельные дочерние родительские трубы. Это касается нескольких детей, и я думаю, что там я запутался. Спасибо за вашу помощь!

код ниже:

int main(int argc, char *argv[]) { 
    int fd[4]; 
    int a, b, c, c0, c1, status; 
    char char0[10]; 
    char char1[10]; 
    pid_t child0; 
    pid_t child1; 
    pid_t overview; 

    // Set argv to ints 
    a = atoi(argv[1]); 
    b = atoi(argv[2]); 
    c = atoi(argv[3]); 

    // Pipe 
    pipe(fd); 

    // child0 
    if((child0 = fork()) == 0) { 
     close(fd[2]); 
     c0 = a*b; 
     sprintf(char0, "%d", c0); 
     write(fd[0], char0, 10); 
     close(fd[0]); 
     exit(0); 
    } 

    // child1 
    if((child1 = fork()) == 0) { 
     close(fd[2]); 
     c1 = b*c; 
     sprintf(char1, "%d", c1); 
     write(fd[1], char1, 10); 
     close(fd[1]); 
     exit(0); 
    } 

    // overview 
    if((overview = fork()) == 0) { 
     close(fd[0]); 
     close(fd[1]); 
     read(fd[2], char0, 10); 
     read(fd[2], char1, 10); 
     printf("%s %s", char0, char1); //Prints weird stuff?? 
     close(fd[2]); 
     exit(0); 
    } 

    // Wait for children to finish 
    waitpid(child0, &status, 0); 
    waitpid(child1, &status, 0); 
    waitpid(overview, &status, 0); 
    exit(0); 
} 

ответ

1

Ваш код для объявления трубы совершенно неправильно, трубы будут иметь только два конца и для объявления трех труб необходимо объявить следующий

pd1[2]; 
pd2[2]; 
pd3[2]; 

с одного конца вы можете написать, что это pd1[1];

, а с другого конца вы можете прочитать pd1[0];

Так что ваш код будет выглядеть,

int main(int argc, char *argv[]) { 
    int fd1[2]; 
    int fd2[2]; 
    int fd1[2];   
    int a, b, c, c0, c1, status; 
    char char0[10]; 
    char char1[10]; 
    pid_t child0; 
    pid_t child1; 
    pid_t overview; 

    // Set argv to ints 
    a = atoi(argv[1]); 
    b = atoi(argv[2]); 
    c = atoi(argv[3]); 

    // Pipe 
    pipe(fd1); 
    pipe(fd2); 
    pipe(fd3); 
    // child0 
    if((child0 = fork()) == 0) { 
     close(fd1[0]); 
     c0 = a*b; 
     sprintf(char0, "%d", c0); 
     write(fd1[1], char0, 10); 
     close(fd[1]); 
     exit(0); 
    } 

    // child1 
    if((child1 = fork()) == 0) { 
     close(fd2[0]); 
     c1 = b*c; 
     sprintf(char1, "%d", c1); 
     write(fd2[1], char1, 10); 
     close(fd2[1]); 
     exit(0); 
    } 

    // overview 
    if((overview = fork()) == 0) { 
     close(fd1[1]); 
     close(fd2[1]); 
     read(fd1[0], char0, 10); 
     read(fd2[0], char1, 10); 
     printf("%s %s", char0, char1); //Prints weird stuff?? 
     //close(fd[2]); 
     exit(0); 
    } 

    // Wait for children to finish 
    waitpid(child0, &status, 0); 
    waitpid(child1, &status, 0); 
    waitpid(overview, &status, 0); 
    exit(0); 
} 

Этот код также может не исправить, я только что объяснил, как использовать трубы, см открытие и закрытие труб, что во время написания чтения конец должен быть закрыт, и в то время как конец записи чтения должен быть закрыт.

редактировать

видеть этот пост и выполнить небольшую программу, а затем изменить свой шаг за шагом кода вы получите понять.

How to send a simple string between two programs using pipes?

+0

не печатает правильно после изменения моего кода. Ты знаешь почему? – user2837858

+0

какие значения вы передаете в качестве аргументов и какой результат вы получаете. и, как я сказал cross, проверьте, что вы используете правильный дескриптор для чтения и записи. – Ali786

+0

Я просто перехожу в 1 2 3, так что это будет './a.out 1 2 3'. Ожидаемый результат должен быть «2 6», но я получаю случайный набор символов, таких как ' M^ēu u '. Я проверил, что вычисления действительно работают при отладке. Он просто никогда не распечатывается правильно. – user2837858