Я работаю над школьным проектом, и хотя это не требуется, я хочу реализовать эту функциональность. С учетом сказанного я не могу поделиться кодом, но я думаю, что в этом случае это не имеет значения.Управление 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(), так что я застрял.
Спасибо!
Возможный дубликат [Реализация конвейерной обработки в c. Какой был бы лучший способ сделать это? (Собственная оболочка linux)] (http://stackoverflow.com/questions/13331139/implementing-pipelining-in-c-what-would-be-the-best-way-to-do-that-own-linux) –
Если я правильно понимаю, вы, вероятно, захотите что-то сделать с терминалом (termcap или terminfo?), Если это возможно, чтобы сообщить ему генерировать SIGTTIN и/SIGTTOU [сигналы управления работой] (http://www.gnu.org/ программное обеспечение/Libc/ручной/html_node/Job-Control-Signals.html). Это было с тех пор, как я изучил это, поэтому я не могу предоставить фактический ответ, к сожалению. –
Прочтите [Расширенное программирование на Linux] (http://advancedlinuxprogramming.com/); он довольно хорошо объясняет, как использовать [pipe (7)] (http://man7.org/linux/man-pages/man7/pipe.7.html) -s –