2014-02-17 3 views
0

Я использую pipe для отправки массива чисел в другой процесс для их сортировки. До сих пор я могу получить результат из другого процесса, используя fdopen. Тем не менее, я не могу понять, как отправлять данные из канала в качестве stdin для другого процесса.put pipe to stdin другой процесс

Вот мой код:

 
     int main() 
     { 
      int fd[2], i, val; 
      pid_t child; 
      char file[10]; 
      FILE *f;

 pipe(fd); 

     child = fork(); 
     if (child == 0) 
     { 
      close(fd[1]); 
      dup2(fd[0], STDIN_FILENO); 
      close(fd[0]); 
      execl("sort", "sort", NULL); 

     } 
     else 
     { 
      close(fd[0]); 
      printf ("BEFORE\n"); 
      for (i = 100; i < 110; i++) 
      { 
       write(fd[1], &i, sizeof (int)); 
       printf ("%d\n", i); 
      } 
      close(fd[1]); 
      wait(NULL); 
     } 
    } 

Кстати, как может другой процесс получить ввод? Scanf?

ответ

0

Я думаю, что ваша труба настроена правильно. Проблемы могут начинаться с execl(). Для этого вызова вы должны указать абсолютный путь, который, вероятно, /bin/sort, если вы имеете в виду утилиту Unix. Существует также версия вызова execlp(), который автоматически ищет PATH.

Следующая проблема заключается в том, что sort является текстовым, точнее, основанным на линии, и вы отправляете двоичный мусор в его STDIN.

В родительском процессе вы должны написать форматированный текст в трубу.

FILE *wpipe = fdopen(fd[1], "w"); 
for (i = 100; i < 110; i++) { 
    fprintf(wpipe, "%d\n", i); 
    ... 
} 
fclose(wpipe); 

Обратный цикл от 110 до 100 может протестировать вашу сортировку немного лучше.

+0

Я пишу сортировку сам, но благодаря вам, я понимаю, что это основанный на тексте; поэтому, когда я меняю все на строку, он отлично работает :) – babydragon

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