Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建unixshell_Shell_Unix - Fatal编程技术网

创建unixshell

创建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,而是直接执行指定的程序

我想为UNIX创建一个迷你shell,以便了解一切的细节。我对过去理所当然的理解有些困惑。这是一个哲学问题。当我创建一个“shell”时,我假设我有一个没有shell的UNIX,那么在这种情况下std in和std out是什么呢?不是像system()和exec()这样的函数使用shell来执行程序,所以如果我首先创建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的标准输入、输出和错误