Intereting Posts
Как разделить FvwmButtons Имеет ли бит suid какой-либо смысл для файлов устройств? Точный путь MySQL Удаленная команда в файле конфигурации ssh Проверка вашего интернет-соединения с помощью speedtest-cli и просмотра Почему я не могу запустить команду как пользователь, имеющий / bin / false в качестве оболочки входа? Почему вывод для `grep -o` совпадает с LC_ALL = C или без него? Наследование прав на запись группы, но не выполнение для файлов, на OmniOS (Illumos) с использованием ZFS ACL Какой минимальный минимум я должен установить на безголовую коробку Red Hat (или CentOS) или Ubuntu, чтобы запускать программы GUI через X11 через SSH Как Linux kernel 3.x управляет ramdisk как блочным устройством? Экран GNU: перемещение между регионами Установить громкость с терминала rdist необходимо заменить rsync iceweasel (firefox) переустановка браузера Принятие udev игнорировать определенные устройства во время загрузки

Каковы стандартные stdin и stdout дочернего процесса?

Я хотел бы знать, каковы стандартные stdin и stdout дочернего процесса (если есть такие значения по умолчанию). Являются ли stdin и stdout дочернего процесса такими же, как и его родительский процесс? Это что-то унаследовано от родителя или чего-то, установленного родителем? Или stdin и stdout дочернего процесса подключены к stdin и stdout родительского процесса?

В моем понимании родительский и дочерний языки не передаются по каналам, но вначале клоны, поэтому я думаю, что stdin и stdout для ребенка точно такие же, как и у родителя, но я не уверен.

Например, в терминале, использующем bash в качестве оболочки входа, если я sh он создаст процесс дочерней оболочки, который будет иметь как stdin на клавиатуре, так и stdout на экране терминала, так же, как и его родитель. Я хочу понять, как были определены stdin и stdout ребенка и каковы они.

Я хочу знать, если, например, в этом случае, если stdin и stdout для ребенка похожи на родителя, это потому, что stdin родителя передается в дочерний stdin, а родитель просто «перенаправляет» свой вклад в дочерний элемент или если ребенок получает его ввод непосредственно с клавиатуры.

В этом же случае, если родитель и ребенок имеют один и тот же stdin, означает ли это, что родительский процесс обрабатывает те же команды, которые были введены для ребенка? Почему мы видим только stdin / out ребенка в терминале, а не его родителя?

Посмотрите на страницу man for fork (2). Детский процесс наследует дескрипторы файла родителя, включая стандартный ввод и стандартный вывод. Для одной команды оболочка просто позволяет дочернему процессу наследовать эти дескрипторы и записывать свой вывод на терминал. Для конвейера он обрабатывает каждый процесс, устанавливает канал между выходом одного и входом следующего, а затем выполняет (exec (2)) исполняемый файл каждого ребенка.

Предыдущий ответ правильный, но я бы посоветовал вам пойти дальше и узнать, как использовать strace. strace присоединяется к процессу, а затем печатает каждый системный вызов, который процесс делает на ваш терминал. Это может быть очень образовательным и, возможно, немного подавляющим. Каждый системный вызов имеет справочную страницу, и вы увидите каждое небольшое действие, которое программа делает в мельчайших подробностях. Это очень полезно для отладки проблемных процессов.