创建unixshell
我想为UNIX创建一个迷你shell,以便了解一切的细节。我对过去理所当然的理解有些困惑。这是一个哲学问题。当我创建一个“shell”时,我假设我有一个没有shell的UNIX,那么在这种情况下std in和std out是什么呢?不是像system()和exec()这样的函数使用shell来执行程序,所以如果我首先创建shell的话。这些函数是如何工作的?创建unixshell,shell,unix,Shell,Unix,我想为UNIX创建一个迷你shell,以便了解一切的细节。我对过去理所当然的理解有些困惑。这是一个哲学问题。当我创建一个“shell”时,我假设我有一个没有shell的UNIX,那么在这种情况下std in和std out是什么呢?不是像system()和exec()这样的函数使用shell来执行程序,所以如果我首先创建shell的话。这些函数是如何工作的?系统(3)确实使用(可能直接或间接通过exec)shell来完成其工作exec(3)和friends不使用shell,而是直接执行指定的程序
系统(3)
确实使用(可能直接或间接通过exec)shell来完成其工作<但是,code>exec(3)和friends不使用shell,而是直接执行指定的程序映像。您只需阅读各自的man
页面即可看到这一点
一个区别是,使用system(),您将看到类似于糖的通配符被展开,而如果您使用exec()将*
作为参数传递给您的程序,您的程序将看到文字星号(并且可能不知道该做什么)
shell可以使用exec()等工具实现。它从称为TTY(电传打字机,或老式终端)或PTY(伪终端,如现代系统中的伪终端)的东西获取其stdin和stdout。参见
posix\u openpt(2)
,execlp(3)
,execv(3)
,execvp(3)
,execle(3)
,execlp(3)
,execv(3)
。第一个调用,execve(2)
由操作系统内核作为系统调用提供。(好的,程序调用的函数是由system C库提供的,但它是围绕系统调用的简单包装器。)其他函数提供稍有不同的语义,并根据execve(2)
函数实现
shell可以使用execvp(3)
或execlp(3)
来提供路径
搜索可执行文件,但至少bash(1)
散列可执行文件的完整路径名以提供性能优势。(有关详细信息,请参见bash(1)
内置hash
)
正如您所猜测的,系统(3)是通过/bin/sh-c
实现的
标准的输入和输出由生成shell的程序设置。如果用户直接登录控制台,它将由agetty(8)
或mgetty(8)
或任何类似的getty
程序处理直接登录。如果用户通过sshd(8)
登录,则sshd(8)
负责创建pty
并将终端从机委托给shell。如果用户通过xterm(1)
或其他终端模拟器创建shell,那么这些进程将负责连接shell的标准输入、输出和错误