2016-04-01 3 views
-1

Я пишу в программе, чтобы отец попросил пользователя вставить номер для вычисления факториала числа. Это число рассчитывается в factorial.cC Как получить результат другой программы с функциями и трубами exec

Так что я думаю, что мне нужно сделать, это:

-Father задать номер для пользователя:

-Factorial.c отсчитать количество и рассчитать количество

-Factorial.c написать число вычисляется

-do dup2, чтобы перенаправить вывод

 // 2 Pipe and Fork created 
     if(x == 0){ //Father 

     close(p1[0]); 
     write(p1[1],&number_by_keybord, BUFFER); 
     close(p1[1]); 
     close(p[1]);  

     dup2(p[0],0); //Read the number returned by factorial.c 
     read(p[0], &num_factorial,BUFFER); 
     printf("Pipe: factorial %d\n", num_factorial);   
     close(p[0]);     
     wait(NULL); 

    }else{   
    execlp("./factorial", "factorial", NULL); 
    perror("Exec error\n"); 
    }  

А теперь factorial.c

void main(){ 
     read(0,&num,sizeof(int)); 

     //Number calculated 

     write(1,&result,sizeof(int)); 
    return 0; 
    } 

Но когда я выполнить программу зависаний или просто поставить случайное число расчетливый

Существует любой проблема- с dup2? я думаю, чтобы получить правильный результат, я должен сделать dup2 (, 0), а в факториале мне нужно прочитать и написать

Спасибо!

+0

В чем вопрос? Я не вижу здесь никакого вопроса. Вопросы заканчиваются вопросительным знаком (***? ***) – abelenky

+1

Вы не представили достаточно кода для дублирования проблемы. –

+0

В остальном код его просто метод для создания труб и вилок, попросите номер для пользователя (number_by_keybord) и для вычисления факториала в factorial.c ... Возможно, мне нужно больше кода для использования dup и чтобы получить результат factorial.c ... но я думаю, я не нуждаюсь. Предложение приемлемо? – Joseph

ответ

0

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

... 
}else{ 
    dup2(p1[0], 0); 
    dup2(p[1], 1); 
    execlp("./factorial", "factorial", NULL); 
    perror("Exec error\n"); 
}