Каковы стандартные 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 ребенка в терминале, а не его родителя?

2 Solutions collect form web for “Каковы стандартные stdin и stdout дочернего процесса?”

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

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

  • Как я могу захватить stdout / stderr в файле, но все еще вижу его в моей консоли?
  • vim: Синтаксис синтаксиса с помощью аргумента командной строки
  • Неясно, где идет выход bash
  • Оператор вывода вывода в python не входит в журнал cron
  • Как ничего не делать вечно элегантным способом?
  • `docker logs foo | less` не доступен для поиска или прокрутки, но `docker logs foo 2> & 1 | меньше` является
  • Захват stdout из сеанса ssh на локальную машину
  • Как кодировать разные типы данных для STDOUT, чтобы STDIN мог определить, что это такое?
  • Как создать реальную копию дескриптора файла stdout и stderr без использования unbuffer / script / tee только с встроенными встроенными в bash?
  • перенаправить вывод {time}
  • Перенаправить stdin и stdout в порты
  • Interesting Posts

    Как взять sha-1, sha-256 или MD5 из CD / DVD?

    Плохой сектор в каталоге

    Установите ffmpeg 0.7.1-5 из debian package

    Установка OpenOffice из командной строки Redhat Linux 6

    vi – как добавить определенные символы в конце строки

    wifi не работает, я установил правильные драйверы?

    Сортировка ls по времени, когда слишком много файлов для одного вызова

    Переместите свободное пространство с конца диска на первый раздел с gparted

    Предотвратите попытки пользователей убивать процессы, которые у них есть.

    Zero input_file_names в Grep

    Почему «dir-or-file-in-usr-local» является ошибкой, а не предупреждением?

    Переименование файлов на основе содержимого текстового файла

    Запретить stdin ждать первого сообщения из именованного канала

    У меня есть Debian на моем сервере. Должен ли я использовать версию программного обеспечения Centos или Ubuntu, которую мне нужно установить?

    Загрузилась командная строка grub2 вместо ubuntu os

    Linux и Unix - лучшая ОС в мире.