Замените свой стандартный вывод указателем FILE *, полученным из popen (3), без использования dup (2) - PullRequest
0 голосов
/ 10 апреля 2019

В недавнем назначении курса нам сказали реализовать базовый интерпретатор оболочки с поддержкой максимум 1 канала.Например, результирующая программа должна вести себя в основном идентично оболочке POSIX при следующем вводе:

cat 1.txt | grep abcd

(По не более 1 , это означает, что нашей программе не нужно обрабатыватьв случае нескольких каналов, таких как cat | cat | cat.)

Наши ассистенты перечислили следующие системные вызовы для использования:

fork  waitpid  execv  system  popen  pclose

Давайте игнорируем тот факт, что на самом деле только 2 из них системные вызовы .У меня проблема в том, что я понятия не имею, как я могу заменить стандартный поток текущего процесса указателем FILE*, возвращаемым popen (3).

Существует специальное требование, которое я не хочуответ, подсказывающий мне получить файловый дескриптор с fileno (3) и затем dup (2).Это потому, что я уже реализовал свою собственную оболочку (отправка назначения) с pipe (2) и dup (2), полностью игнорируя то, что сказали нам наши TA.И именно поэтому я хочу знать, как это возможно без fileno (3), а затем dup (2).

Предполагая, что dup, dup2 и dup3 (GNU) - это одно и то же (dup ищет неиспользуемые наименьшие номера)fd, тогда как dup2 при необходимости закрывает второй аргумент - основная функция идентична - для дублирования fd).

...