Как узнать, когда команда запрашивает ввод в Linux, C

#c #input #process #fork

#c #ввод #процесс #fork

Вопрос:

Я создаю мини-оболочку, которая может запускать процессы fg и bg. Проблема в том, что если дочерний процесс в фоновом режиме запросит ввод у пользователя, родительское приглашение, ожидающее следующей команды, примет его вместо этого. Как я могу выбрать, какой процесс будет обрабатывать ввод? Заранее благодарю вас.

Комментарии:

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

2. когда ваша оболочка не выполняет процесс на переднем плане, оболочка имеет stdin , когда оболочка выполняет процесс на переднем плане, этот процесс получает stdin , и оболочка вернет stdin , когда процесс завершится или если он остановлен (например, control-z)

3. Поскольку я сам создаю фоновую логику, я не знаю, могу ли я положиться на этот механизм.

4. так это работает с незапамятных времен в Linux / Unix, зачем изобретать новое поведение, ставить людей в затруднительное положение?

5. @EdoardoRosso, вы несете ответственность за реализацию этого механизма (но есть функции, которые вам помогут), потому что это часть того, что означают «передний план» и «фон» в данном контексте. Или еще, как вы думаете, что это должно означать для процесса, находящегося в фоновом режиме?

Ответ №1:

В значительной степени по определению терминал принадлежит процессу переднего плана. Итак, ответ таков: вы не можете выбрать, какой процесс будет обрабатывать ввод терминала; он всегда будет на переднем плане.

Если ваша мини-оболочка не обрабатывает перенаправление, вы обречены. Если это произойдет, вы можете в Linux,

 echo whatever input you have > /proc/PID/fd/0
  

(PID — это pid фонового процесса). Или используйте именованный канал.

Комментарии:

1. В этом нет «почти ничего». Программа, которая имеет управляющий терминал и является членом группы процессов, которая в данный момент управляет им, находится на переднем плане (по отношению к этому терминалу). Тот, который имеет управляющий терминал и не входит в его группу управляющих процессов, находится в фоновом режиме и не получает ввод от терминала, пока он там.

2. @JohnBollinger Спасибо за разъяснение. Однако кажется, что понятия группы процессов и управляющего терминала очень ориентированы на Unix. Хотелось бы, чтобы у меня было авторитетное определение того, что делает процесс процессом переднего плана (VxWorks? QNX? NT?)

3. OP конкретно называет Linux в названии вопроса, поэтому понятия «передний план» и «фон» в стиле UNIX являются естественными в этом контексте. Если вы хотите попытаться обобщить для операционных систем, которые имеют разные значения этих терминов, то обязательно продолжайте, но будущим читателям было бы полезно, если вы дадите понять, что вы это делаете.