2014-09-08 2 views
1

Я работаю над школьным проектом, и хотя это не требуется, я хочу реализовать эту функциональность. С учетом сказанного я не могу поделиться кодом, но я думаю, что в этом случае это не имеет значения.Управление stdout/stdin при написании оболочки Linux

При использовании fork(), я понимаю, что созданный дочерний процесс наследует stdin и stdout, поскольку ребенок наследует все потоки файлов от родителя.

My shell требует возможности фона, и пока он технически уже имеет это, если программа «background» работает, она все равно получает все данные из stdin и продолжает выводить на экран, который является просто беспорядочным беспорядком. Для записи моя скомпилированная тестовая оболочка моего преподавателя делает то же самое, но я не хочу, чтобы это произошло!

Я вполне уверен, что я должен использовать комбинацию pipe(), fork() и dup2(), но я не могу собрать все это вместе. Я понимаю fork, но я не понимаю, как работает pipe или dup2 и как я должен реализовывать его в оболочке. Я имею в виду что-то вдоль этих линий:

thePipe[2] = pipe(); 
pid = fork(); 
close stdin/out on child somehow if backgrounded 

Но я не понимаю, функциональность трубы() или dup2(), так что я застрял.

Спасибо!

+1

Возможный дубликат [Реализация конвейерной обработки в c. Какой был бы лучший способ сделать это? (Собственная оболочка linux)] (http://stackoverflow.com/questions/13331139/implementing-pipelining-in-c-what-would-be-the-best-way-to-do-that-own-linux) –

+1

Если я правильно понимаю, вы, вероятно, захотите что-то сделать с терминалом (termcap или terminfo?), Если это возможно, чтобы сообщить ему генерировать SIGTTIN и/SIGTTOU [сигналы управления работой] (http://www.gnu.org/ программное обеспечение/Libc/ручной/html_node/Job-Control-Signals.html). Это было с тех пор, как я изучил это, поэтому я не могу предоставить фактический ответ, к сожалению. –

+0

Прочтите [Расширенное программирование на Linux] (http://advancedlinuxprogramming.com/); он довольно хорошо объясняет, как использовать [pipe (7)] (http://man7.org/linux/man-pages/man7/pipe.7.html) -s –

ответ

2

Вам не нужны трубы здесь. Процессы, запускаемые в интерактивной оболочке, должны делиться своими стандартными файловыми дескрипторами с оболочкой - иначе они могли бы сломать намного больше вещей (включая способность дочерних процессов определять, что они работают в интерактивном режиме, и взаимодействовать с tty для обработки таких вещей, как окно изменения размера). Это также серьезно осложнит трубопроводы. Не делай этого.

Отсутствует здесь группы процессов, которые описаны в разделе "General Terminal Interface" спецификаций Open Group UNIX. Короче говоря, ядро ​​может быть сделано для явного распознавания «группы процессов переднего плана» для терминала. Если процесс, который не входит в эту группу, пытается читать или записывать на терминал, он автоматически останавливается.

Краткое описание того, что необходимо для создания нормально функционирующей оболочки, доступно как часть руководства GNU libc под номером "Implementing a Job Control Shell". Попробуйте выполнить их инструкции и посмотрите, как это происходит.

+0

Большое спасибо. Теперь это еще одна из тех вещей, которые у меня не хватало времени, чтобы следить за тем, как проект был завершен, и теперь у нас есть еще один назначенный. В ближайшем будущем я пересмотрю нашу оболочку. Теперь, когда проект завершен, и последний срок прошел, я сделал код общедоступным: https://github.com/ccs19/sysnet1p1 –

Смежные вопросы