Мини-оболочка 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()
  • Обработка сигналов

Советы и советы

Лучший способ справиться с огромной проблемой — разбить ее на более мелкие части, а затем решать одну часть за другой. Я начал с создания дочернего процесса, а затем перешел к выполнению пользовательской команды. После того, как это было сделано, я реализовал поддержку части фонового процесса.

Заключительные мысли и следующие шаги

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

Этот проект меня многому научил, но больше ничего не предлагает. Так что больше на этом задерживаться не буду. Еще много новых весело проекты ждут!

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *