Ваша программа делает именно то, что вы запрограммировали: она создает два канала и один дочерний процесс выполняется меньше, используя каналы для перенаправления стандартного вывода программы на стандартный вывод меньше и стандартного вывода меньше на стандартный вывод программы.Затем он записывает кучу данных (которые меньше копирует в свой стандартный вывод программы) и ожидает, когда меньше будет завершено.Но этого никогда не произойдет, так как меньше ждет большего ввода.
Если вы хотите, чтобы все прекратилось, вам нужно будет close(STDOUT_FILENO)
перед вызовом waitpid
- если вы добавите это, меньшевыйдет, и waitpid вернется, и ваша программа продолжит работу (и выйдет).Вы все равно ничего не увидите на своем терминале, так как в терминал ничего не пишется - меньше пишет на стандартный вывод вашей программы (которую вы никогда не читаете).
Если вы увеличите количествоПри записи данных вы увидите тупик - так как вы никогда не читаете stdin, как только канал fd2 заполняется, less блокирует запись, а затем, когда fd1 также заполняется, ваша программа блокируется.Размеры каналов по умолчанию в Linux довольно велики, однако, для этого потребуется много данных.
Обратите внимание, что вы также можете использовать cat
, так как less
- less
по существу переходит кcat
когда стандартный вывод не является терминалом.
Если вы хотите выводить данные на свой терминал, используя less
для передачи этого (остановка после страницы и т. Д.), Вам необходимо выйти из стандартного вывода.less
указывает на ваш терминал.Просто удалите fd2
и каждую строку, относящуюся к fd2
из приведенного выше кода, и она должна работать - хотя она все равно будет висеть в конце, если вы не close(STDOUT_FILENO)