创建UNIX shell

时间:2011-11-17 02:31:07

标签: shell unix

我想为UNIX创建一个迷你shell,只是为了了解所有内容的来龙去脉。我有些困惑,理解我曾经认为理所当然的事情。这是一个哲学问题。当我创建一个“shell”时,我假设我有一个没有shell的UNIX,那么在这种情况下std in和std会是什么?没有像system()和exec()这样的函数使用shell来执行程序,所以如果我首先创建一个shell。这些功能如何运作?

2 个答案:

答案 0 :(得分:3)

system(3)确实使用(可能直接或间接通过exec)shell来完成它的工作。但是,exec(3)和朋友不使用shell,而是直接执行指定的程序映像。您只需阅读各自的man页面就可以看到这一点。

一个区别是使用system(),你会看到像通配符一样被扩展的糖,而如果你使用exec()将*作为参数传递给你的程序,你的程序将看到文字星号(和可能不知道该怎么做。)

可以使用exec()等实现shell。它从名为TTY(电传打字机或老式终端)或PTY(伪终端,如现代系统)的东西中获取stdin和stdout。请参阅posix_openpt(2)

答案 1 :(得分:3)

exec系列中有多个功能:execve(2)execl(3)execle(3)execlp(3)execv(3),{{1} }。第一个,execvp(3)由操作系统内核提供为系统调用。 (好吧,程序调用的函数是由系统C库提供的,但是 it 是一个围绕系统调用的简单包装。)其他函数提供了稍微不同的语义,并以execve(2)函数。

shell可以使用execve(2)execvp(3)提供execlp(3)搜索可执行文件,但至少PATH 哈希的完整路径名可执行文件以提供性能优势。 (有关详细信息,请参阅bash(1)内置bash(1)。)

hash是通过system(3)实施的,正如您所推测的那样。

标准输入和输出由产生shell的程序设置。如果用户直接登录控制台,则会由/bin/sh -cagetty(8)或任何mgetty(8)处理 - 类似程序处理直接登录。如果用户通过getty登录,则sshd(8)负责创建sshd(8)并将终端从属委托给shell。如果用户通过pty或其他终端仿真器创建它们的shell,那么这些进程将负责连接shell的标准输入,输出和错误。

相关问题