编写shell - 如何执行命令

时间:2013-01-23 06:30:51

标签: c gnu

我正在尝试编写一个最终会利用并发性的shell。现在我有一个工作的shell解析器,但我无法弄清楚如何执行命令。我看了一下execexecvp等)看起来很有希望,但我有一些问题。

exec可以处理文件输入/输出重定向吗?我可以使用exec设置管道吗?

我也想知道子弹。子弹回归应该怎样;最后一个陈述的退出状态?子壳可以成为管道的一部分吗?

这些可能看起来真的是愚蠢的问题,但请耐心等待我的经验。

2 个答案:

答案 0 :(得分:1)

  

exec可以处理文件输入/输出重定向吗?

不,您使用open()dup()dup2()(以及close())执行此操作。

  

我可以使用exec设置管道吗?

不,您可以使用pipe()dup()dup2()以及许多close()来电。

  

我也想知道子弹。子壳返回什么,它的最后一个语句的退出状态?

这是正常的惯例,是的。

  

子壳可以成为管道的一部分吗?

是。在普通shell中,您可以编写如下内容:

(cd /some/where; find . -name '*.png') | sed 's/xyz/prq/' > mapped.namelist

如果您想害怕,可以调查posix_spawn()及其支持功能。在POSIX 2008网站上搜索“spawn”,并准备好害怕。我认为实际的绘图工作实际上比使用posix_spawn()及其支持者编纂它更容易。

答案 1 :(得分:1)

shell的标准技术是使用fork-exec。在此模型中,要执行应用程序,shell使用fork创建一个新进程,该进程是其自身的副本,然后使用其中一个exec变量将其自己的代码,数据等替换为指定的信息通过磁盘上的可执行文件。

关于这个模型的好处是shell在更改其地址空间之前可以对文件描述符(不会被exec抛弃)做一些额外的工作。因此,要实现重定向,它会更改文件描述符0,1和2(分别为stdin,stdout和stderr)以指向另一个打开的文件,而不是控制台I / O.您使用dup2更改其中一个文件描述符的含义,然后执行exec以启动新进程。