2011-11-17 47 views
7

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

回答

3

有在exec家庭几个功能:execve(2)execl(3)execle(3)execlp(3)execv(3)execvp(3)。第一个,execve(2)由操作系统内核作为系统调用提供。 (好吧,程序调用的函数是由系统C库提供的,但它是一个围绕系统调用的简单包装。)其他函数提供稍微不同的语义,并且按照execve(2)函数实现。

的壳可以使用execvp(3)execlp(3)提供PATH搜索可执行文件,但至少bash(1)哈希可执行文件的完整路径,以提供性能优势。 (见bash(1)内置hash了解详情。)

system(3)通过/bin/sh -c实现的,因为你已经猜到。

标准输入和输出由程序派生shell的程序设置。如果用户直接在控制台上登录,则将由agetty(8)mgetty(8)或者其中任一个getty处理直接登录。如果用户通过sshd(8)登录,则sshd(8)负责创建pty并将终端从站委托给shell。如果用户通过xterm(1)或其他终端仿真程序创建它们的shell,那么这些进程将负责连接shell的标准输入,输出和错误。

3

system(3)的确使用(可能直接或间接通过exec)shell来完成其工作。然而,朋友不要使用shell,而是直接执行指定的程序映像。您只需阅读各自的man页面即可看到此内容。

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

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

+0

哦非常感谢 – Keeto