Мини-оболочка Linux с использованием C
Обо мне
Я преподаватель и разработчик. Я получил степень магистра в области вычислительной техники. Я преподаю с 2011 года и программирую со студенческих времен. Я работал в нескольких компаниях по разработке программного обеспечения, помогая создавать их продукты.
Я также сделал много весело проекты. Делюсь одним из них здесь.
Проблема, которую я хотел решить
мне попался один такой весело проект, когда я работал онлайн-репетитором. Проект был о написании собственного Оболочка Linux. Я хотел поработать над этим, так как это был первый раз, когда я разрабатывал что-то подобное.
Что такое мини-оболочка Linux?
Мини-оболочка Linux — это программа, которая ведет себя точно так же, как и оболочка Linux, хотя и с ограниченной функциональностью.
- Он поддерживает встроенные команды оболочки, такие как «cd» и «exit».
- Он поддерживает перенаправление ввода и вывода.
- Он поддерживает фоновый процесс.
Стек технологий
Поскольку это оболочка Linux, единственным возможным языком для использования был С; поскольку он родной для Linux. Так же POSIX библиотека требовалась для реализации оболочки.
Процесс сборки оболочки
Трудно было придумать, с чего начать. я имел дело с fork()
функция впервые. fork()
создает дочерний процесс, который может работать одновременно с родительским процессом в системе. Дочернему процессу можно дать другую задачу для выполнения. В этом случае дочерний процесс будет выполнять команду, введенную пользователем в оболочке. Поэтому я начал читать о fork()
. Я, конечно же, начал с справочная страница за fork()
. Но этого было недостаточно, поэтому я прочитал несколько статей, объясняющих использование fork()
с примерами.
Теперь, вооружившись этими знаниями, я пошел дальше, чтобы выяснить, как дочерний процесс будет выполнять команду, введенную пользователем. Должен ли я кодировать все возможные команды? Что ж, ответ был нет. В Linux есть действительно полезное семейство функций, а именно. exec()
. Эти функции помогают выполнить команду в Linux. Итак, я прочитал справочная страница для этого и узнал, что execvp()
функция лучше всего подходит для моего кода.
Когда с этим разобрались, следующим было просто логическое кодирование всей программы оболочки, что оказалось довольно просто. Вы можете найти весь код на Гитхаб здесь.
Проблемы, с которыми я столкнулся
Сложнее всего было понять, как использовать fork()
и установка обработчик сигналов.
Обработчик сигнала требуется, так как эта оболочка поддерживает фоновые процессы. Дочерний процесс, отправленный в фоновый режим, должен сигнализировать родительскому процессу о завершении своего выполнения. Это можно сделать с помощью waitpid()
функция с WNOHANG
вариант. Мне пришлось прочитать несколько статей на эту тему, чтобы понять это правильно.
Основные выводы
Новые вещи, которые я узнал
fork()
execvp()
- Обработка сигналов
Советы и советы
Лучший способ справиться с огромной проблемой — разбить ее на более мелкие части, а затем решать одну часть за другой. Я начал с создания дочернего процесса, а затем перешел к выполнению пользовательской команды. После того, как это было сделано, я реализовал поддержку части фонового процесса.
Заключительные мысли и следующие шаги
Подобные проекты могут показаться очень сложными, и можно подумать, что реализация может выйти из-под контроля (особенно для новичков). Но, это не повод сдаваться. Если человек продолжает пытаться решить подобную проблему, в конце концов он добьется успеха и по пути узнает много нового.
Этот проект меня многому научил, но больше ничего не предлагает. Так что больше на этом задерживаться не буду. Еще много новых весело проекты ждут!