Могут ли несколько процессов в конвейере читать из стандартного ввода терминала?

Это происходит из-за того, что Windows регистрирует загрузчик Windows как загрузчик по умолчанию, поэтому вы не встречаете GRUB.

Чтобы решить эту проблему,

Прежде всего создайте live CD с linux. В настоящее время,выключите компьютер и загрузите его с live CD. И попробуйте восстановить загрузку, следуя инструкциям здесь .

Если это не поможет, загрузитесь в Windows.

  • Запустите командную строку с правами администратора.
  • Тип

Если ваша система Linux 64-битная.

bcdedit /set {bootmgr} path \EFI\debian\grubx64.efi

, если ваша система Linux 32-битная.

bcdedit /set {bootmgr} path \EFI\debian\grubia32.efi

Эта команда сделает загрузчик GRUB загрузчиком по умолчанию для вашей системы.

1
25.07.2019, 02:28
2 ответа

Вы смешиваете много вещей, стандартный ввод, вывод, файловые дескрипторы ошибок (fds )— это не то же самое, что терминал fd.

Когда вы открываете терминал и вводите команду, по умолчанию эти 3 fds (stdin (0 ),stdout (1 ),stderr (2 ))«точка» на терминал, но это можно изменить, перенаправив любой из этих fds (, например, «ls non _существующий _файл 2>err» перенаправит сообщения об ошибках в файл «err», и вы не будете см. его на терминале ).

Теперь я хотел бы обратиться к вашей строке «open /dev/tty»,который на самом деле указывает на ваш ТЕРМИНАЛ, чтобы продемонстрировать разницу, проверьте этот образец программы.enter image description hereПроще говоря, как работает трубопровод:

Когда вы передаете две команды (без символов «<» или «>» ), первая команда будет вводить данные с клавиатуры (, если она требует чтения ввода ), и перенаправляет свой вывод быть принятым в качестве входных данных второй командой, это означает, что «стандартный» ввод вашего процесса «b» больше не является терминалом, а является выходом процесса «a».

Из Википедии

Теперь, чтобы окончательно ответить на ваш вопрос, вам нужно знать еще 2 вещи:

1 )Когда вы запускаете процесс на передний план, оболочка передаст этому процессу управление терминалом и будет ждать завершения процесса, чтобы вернуть себе управление терминалом и любыми клавиатурными -генерируемыми сигналами будут отправлены этому контролирующему процессу во время его выполнения.

2 )При запуске конвейерной команды (cmd1 | cmd2 ), оболочка сначала поместит эти 2 процесса в одну «группу процессов» (. Если вы хотите узнать больше, прочтите об управлении заданиями ). Итак, что происходит с вашим «a | b», так это то, что эти 2 процесса находятся в одной группе процессов, поэтому любые сигналы, сгенерированные клавиатурой -, будут отправлены ОБОИМ этим процессам. потому что сигналы, сгенерированные клавиатурой -, отправляются всей группе процессов, а НЕ отдельному процессу. Надеюсь, это ответ на ваш вопрос, не стесняйтесь задавать вопрос, если что-то непонятно

1
27.01.2020, 23:22
  1. Необходимо уточнить, что сигналы типа Ctrl -C НЕ передаются через стандартный ввод. Когда вы набираете Ctrl -C на своем терминале, «Ctrl» и «C» не передаются вашему процессу напрямую как 2 необработанных символа, драйвер tty интерпретирует их как сигнал SIGINT и отправляет сигнал вашей группе процессов переднего плана.

  2. Если вы нажмете Ctrl -C во время работы a | b, ОБА из двух процессов получат сигнал SIGINT. Чтобы проверить это, вы можете нажать Ctrl -C во время выполнения этой команды :

  3. .
tail -f /var/log/syslog | grep some_pattern

, и вы сразу же увидите приглашение оболочки, что означает, что оба процесса прерваны.

И как это?

  • После того, как вы вошли -в оболочку, вы находитесь в сеансе , все программы, запущенные в оболочке, принадлежат этому сеансу.

  • Сеанс может иметь управляющий терминал , он обычно принимает ввод с клавиатуры и выводит на экран. Процессы в этом сеансе читают stdin с управляющего терминала, записывают stdout и stderr на управляющий терминал и получают сигналы от управляющего терминала.

  • Процессы, связанные с shell pipe, образуют группу процессов. например.:

proc1 | proc2 &

или подобное

proc3 | proc2 | proc5
  • Сеанс может иметь одну группу приоритетных процессов и одну или несколько групп фоновых процессов . Группа процессов, блокирующая вашу оболочку и занимающая ваш экран переднего плана, является группой процессов переднего плана. В то время как группа процессов, управляемая &, будет группой фоновых процессов.

  • Всякий раз, когда вы вводите последовательности, подобные «Ctrl -C» в управляющем терминале, сигнал будет отправлен всем процессам в группе процессов переднего плана.

3
27.01.2020, 23:22

Теги

Похожие вопросы