Поставить трубку на стандартный процесс другого процесса

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

Другие вопросы по тегам