我想为UNIX创建一个迷你shell,只是为了了解所有内容的来龙去脉。我有些困惑,理解我曾经认为理所当然的事情。这是一个哲学问题。当我创建一个“shell”时,我假设我有一个没有shell的UNIX,那么在这种情况下std in和std会是什么?没有像system()和exec()这样的函数使用shell来执行程序,所以如果我首先创建一个shell。这些功能如何运作?
答案 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 -c
或agetty(8)
或任何mgetty(8)
处理 - 类似程序处理直接登录。如果用户通过getty
登录,则sshd(8)
负责创建sshd(8)
并将终端从属委托给shell。如果用户通过pty
或其他终端仿真器创建它们的shell,那么这些进程将负责连接shell的标准输入,输出和错误。