簡體   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