繁体   English   中英

编写外壳-如何执行命令

[英]Writing a shell - how to execute commands

我正在尝试编写一个将最终利用并发性的shell。 现在,我有一个运行中的shell解析器,但是在弄清楚如何执行命令时遇到了麻烦。 我看了一下execexecvp等),看起来很有希望,但是我有一些疑问。

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

我也想知道子壳。 子外壳应该返回什么? 最后一条语句的退出状态? 子壳可以成为管道的一部分吗?

这些问题看起来似乎很愚蠢,但请您耐心等待。

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()及其支持者进行posix_spawn()更容易。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM