Как я могу реализовать свою собственную базовую оболочку unix в C?
Я новичок в обработке и управлении потоками. Моя оболочка должна понимать переменную среды PATH
. Он может быть установлен и изменен. Он работает в двух режимах: интерактивный и пакетный. Shell может принимать более одного задания, например, ls; ps; wc file; cal. Я хочу, чтобы мои руки тоже загрязнялись сигналами. Поэтому я должен также обрабатывать ^ K, ^ c.
Я знаю, что мне придется использовать execs, forks и pipe, но просто не могу начать работу.
Ответы
Ответ 1
Все оболочки unix являются open-source - поэтому хорошим местом для начала может быть чтение кода.
Если вы ищете хорошую стартовую статью на эту тему, попробуйте Написание собственной оболочки из Бюллетеня Linux.
Еще одна хорошая отправная точка - взглянуть на исходный код mini-shell только потому, что его один из самых маленьких, чтобы получить вашу голову раунд.
Ответ 2
Ваш основной цикл:
- прочитайте строку (используйте
fgets(3)
для простой оболочки, readline(3)
для фантазии)
- проанализировать команду
- и выполнить конвейеры
Чтобы проанализировать команду, есть два общих варианта. Напишите рекурсивный парсер спуска или используйте yacc(1)
для его создания. Гораздо проще выбить начальный синтаксический анализатор с помощью yacc
, но вы можете полностью заткнуть его отладку, и он действительно хочет быть свободным от контекста. Я предпочитаю рекурсивный спуск, но почти все остальные в мире предпочитают использовать yacc. (Технически, bison
.) Если оболочка действительно очень простая, например, домашняя оболочка, yacc может быть переполнена.
Чтобы сделать лексический анализ, вы также можете использовать свой собственный или использовать flex.
Вам не нужно использовать какие-либо потоки.
Ответ 3
Многие из книг Unix, описывающие основные системные вызовы, также реализуют оболочку, чтобы проиллюстрировать, как и почему вы можете использовать различные вызовы. Стивенс и Рочкинд - две такие книги: