Взаимодействие ядра с оболочкой - PullRequest
1 голос
/ 16 декабря 2011

Я пытаюсь написать оболочку для Linux на C и / или C ++.Какие функции я должен использовать для взаимодействия с ядром?Кто-то сказал использовать system(), но я думаю, что он вызывает оболочку, что приведет к бесконечной рекурсии.Кто-то сказал что-то о fork() и exec().

Очевидно, что хорошей оболочке нужен какой-то способ доступа к файловой системе.Я предполагаю, что ядро ​​предоставляет некоторый интерфейс для этого, не так ли?Как бы я прочитал вывод из ядра?Это текст или целые числа?

Есть ли место, где я могу найти хорошую документацию по необходимым функциям?Есть ли какая-то конкретная страница руководства или файл исходного кода, который я должен прочитать?

Ответы [ 4 ]

5 голосов
/ 16 декабря 2011

Ядро предоставляет набор «системных вызовов» для низкоуровневого выполнения процессов и доступа к файловой системе.Выполнение процесса обычно выполняется с использованием fork() и одного из вызовов exec() семейства .Ввод / вывод может осуществляться с помощью вызовов, таких как open(), stat(), opendir() и т. Д.

Списокбольшинство из более переносимых вызовов (как библиотеки C, так и системных вызовов) можно найти в Open Group Base Specification (щелкните «системные интерфейсы»).Также есть некоторые специфичные для Linux - те, которые предназначены для обычного использования, будут описаны в разделе 2 страниц справочника (ls /usr/share/doc/man/man2 или man 2 somefunction).

3 голосов
/ 16 декабря 2011

Хорошее место для начала - учебник по операционным системам.Я бы порекомендовал " книгу динозавров " Silberschatz et al.Еще один хороший ресурс - страница класса профессора Дэйва Холлингера в RPI для курса по операционным системам.Слайды лекций онлайн, в том числе одна лекция по написанию оболочки.Там также есть домашнее задание по написанию базовой оболочки, которую вы можете проверить.

http://cgi2.cs.rpi.edu/~hollingd/opsys/opsys.php

Оболочка - очень сложная программа, которую невозможно описать в ответе StackOverflow,Однако эти ресурсы должны указывать вам правильное направление.

1 голос
/ 16 декабря 2011

Список системных вызовов , понятных для ядра Linux , документирован на справочной странице syscalls (2) .

Оболочкаобычно не взаимодействуют со всеми из них.Оболочка обычно в основном касается системных вызовов, влияющих на процессы, которые она может выполнять.Например, оболочке обычно не требуется (сама по себе) вызывать системные вызовы mmap или mprotect (даже если реализация malloc, вероятно, вызывает mmap).

0 голосов
/ 16 декабря 2011

Прежде всего вам необходимо знать, какие функции предоставляет существующая оболочка:

1. Формирование исполняемых файлов и их выполнение.

2. Интерпретатор, для скриптов оболочки.

3. Несколько встроенных команд, таких как cd и т. Д.

4. И многое другое. Я бы предложил почитать книгу по ОС UNIX.

Если вы просто хотите запускать команды в вашей новой оболочке ... тогда вам нужно просто разветвить и выполнить (или вы можете сделать это в потоке) уже существующие исполняемые файлы в "/ bin", "/ usr / bin" и т. Д.

Если это просто хобби, я бы порекомендовал вам использовать модуль подпроцесса Python.

...