Как я могу реализовать свою собственную базовую оболочку Unix в C? - PullRequest
23 голосов
/ 30 сентября 2009

Я новичок в управлении процессами и потоками. Моя оболочка должна понимать переменную окружения PATH. Это может быть установлено и изменено. Он работает двумя способами: интерактивным и пакетным. Shell может выполнять более одной работы, например ls; ps; wc file; cal. Я тоже хочу запачкать руки на сигналах. Так что я должен разобраться и с ^ K, ^ c.

Я знаю, что мне придется использовать execs, вилки и трубы, но просто не могу начать.

Ответы [ 3 ]

14 голосов
/ 30 сентября 2009

Все оболочки Unix с открытым исходным кодом, поэтому для начала лучше всего прочитать код.

Если вы ищете хорошую стартовую статью на эту тему, попробуйте Написание собственной оболочки из Linux Gazette.

Еще одна хорошая отправная точка - взглянуть на исходный код mini-shell только потому, что он один из самых маленьких, чтобы поразмыслить.

8 голосов
/ 30 сентября 2009

Ваш основной цикл:

  • читать строку (используйте fgets(3) для простой оболочки, readline(3) для красивой)
  • разобрать команду
  • разветвить и выполнить трубопроводы

Для разбора команды есть два общих варианта. Напишите парсер рекурсивного спуска или используйте yacc(1) для его генерации. Намного проще вывести исходный парсер с помощью yacc, но вы можете полностью застрять в его отладке, и он действительно хочет быть свободным от контекста. Я предпочитаю рекурсивный спуск, но почти все в мире предпочитают использовать yacc. (Технически, bison.) Если оболочка действительно очень проста, например оболочка для домашней работы, yacc может быть излишним.

Для проведения лексического анализа вы также можете свернуть свой собственный или использовать flex.

Вам не нужно будет использовать какие-либо темы.

4 голосов
/ 01 октября 2009

Во многих книгах по Unix, описывающих основные системные вызовы, также реализована оболочка для иллюстрации того, как и почему вы можете использовать различные вызовы. Стивенс и Рохкинд - две такие книги:

...