Поставить трубку на стандартный процесс другого процесса
Я использую канал, чтобы отправить массив чисел другому процессу, чтобы отсортировать их. Пока что я могу получить результат от другого процесса, использующего fdopen. Тем не менее, я не могу понять, как отправить данные из канала в качестве стандартного ввода для другого процесса.
Вот мой код:
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?
1 ответ
Я думаю, что ваша труба настроена правильно. Проблемы могут начаться в 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 может проверить вашу сортировку немного лучше.