Создание оболочки UNIX - PullRequest
       3

Создание оболочки UNIX

7 голосов
/ 17 ноября 2011

Я хочу создать мини-оболочку для UNIX, чтобы узнать все подробности. У меня возникают некоторые затруднения с пониманием того, что я привык воспринимать как должное. Это своего рода философский вопрос. Когда я создаю «оболочку», я предполагаю, что у меня UNIX без оболочки, так что бы в этом случае было std in и std out? такие функции, как system () и exec (), не используют оболочку для выполнения программ, поэтому, если я создаю оболочку в первую очередь. Как работают эти функции?

Ответы [ 2 ]

3 голосов
/ 17 ноября 2011

В семействе exec есть несколько функций: execve(2), execl(3), execle(3), execlp(3), execv(3), execvp(3).Первый, execve(2) предоставляется ядром операционной системы как системный вызов.(Хорошо, хорошо, функция, которую вызывают программы, предоставляется библиотекой системы C, но it - это простая оболочка для системного вызова.) Другие функции предоставляют немного другую семантику и реализуются в терминахexecve(2) function.

Оболочки могут использовать execvp(3) или execlp(3) для обеспечения PATH поиска исполняемых файлов, но по крайней мере bash(1) хэши полный путь к исполняемым файламобеспечить выигрыш в производительности.(Подробнее см. bash(1) встроенный hash.)

system(3) реализован через /bin/sh -c, как вы и предполагали.

Стандартный вход и выход настроенв зависимости от того, какая программа породила оболочку.Если пользователь входит в консоль напрямую, он будет обрабатываться agetty(8) или mgetty(8) или любой другой программой, подобной getty, которая обрабатывает прямой вход.Если пользователь входит через sshd(8), то sshd(8) отвечает за создание pty и делегирование подчиненного терминала в оболочку.Если пользователь создает свои оболочки через xterm(1) или другие эмуляторы терминала, то эти процессы будут отвечать за подключение стандартного ввода, вывода и ошибки для оболочки.

3 голосов
/ 17 ноября 2011

system(3) действительно использует (возможно прямо или косвенно через exec) оболочку для своей работы.exec(3) и друзья, однако, не используют оболочку, а выполняют непосредственно указанный образ программы.Вы можете увидеть это, просто прочитав соответствующие man страницы.

Одно отличие состоит в том, что с помощью system () вы увидите расширение сахароподобных символов, тогда как если вы передадите * в качестве аргумента для вашегоПрограмма, использующая exec (), ваша программа увидит буквальную звездочку (и, вероятно, не будет знать, что делать).

Оболочка может быть реализована с использованием exec () среди прочего.Он получает свои stdin и stdout от того, что называется TTY (телетайп или терминал старой школы) или PTY (псевдо-терминал, как в современных системах).Смотри posix_openpt(2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...