2013-01-23 48 views
0

我正在嘗試編寫一個最終將利用併發性的shell。現在我已經有了一個可用的shell解析器,但是我很難搞清楚如何執行命令。我看了一下execexecvp等),它看起來很有希望,但我有一些問題。編寫一個shell - 如何執行命令

exec可以處理文件輸入/輸出重定向嗎?我可以使用exec設置管道嗎?

我也想知道subshel​​l。什麼東西應該返回;上次聲明的退出狀態?亞殼可以成爲管道的一部分嗎?

這些看起來真的很愚蠢的問題,但請忍受我的經驗不足。

+0

作爲這些基本的Unix編程問題的參考書,我推薦[Michael Kerrisk's * Linux Programming Interface *。](http://man7.org/tlpi/)事實上,第24.2.1和27.4節(第517-520,575-578頁)回答了有關標準I/O重定向的問題。 –

回答

1

exec可以處理文件輸入/輸出重定向嗎?

不,你這樣做有open()dup()dup2()(和close())。

我可以使用exec設置管道嗎?

不,你這樣做有pipe()dup()dup2()和大量的close()電話。

我也想知道subshel​​l。什麼東西應該返回,最後一個陳述的退出狀態?

這是正常的慣例,是的。

亞殼可以成爲管道的一部分嗎?

是的。在一個正常的外殼,你可以寫這樣的:

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

如果你想獲得害怕,你可以調查posix_spawn()和支持功能。在POSIX 2008網站上搜索'spawn',並準備好被嚇到。我認爲做臨時製圖工作實際上比使用posix_spawn()及其支持者進行編纂更容易。

+0

爲什麼看起來好像有很多方法可以在C haha​​h中做同樣的事情。 因此,如果一個子shell出現在管道的右側,是否意味着左側命令的輸出成爲子shell中第一個命令的輸入?只是盲目猜測。 – user1174472

+0

哦,出於某種原因,我可以做到這一點..'ls> file |貓',但沒有輸出。我甚至不知道這意味着什麼,我期待一個語法錯誤。對不起,有一堆愚蠢的問題讓我煩惱,我真的不知道還有什麼地方要問哈哈。 – user1174472

+0

'ls'將其輸出發送到'file';管道上沒有任何東西出現在「貓」上。 –

1

殼的標準技術是使用fork-exec。在這個模型中,爲了執行一個應用程序,shell使用fork來創建一個自己的副本的新進程,然後使用其中一個exec變體用可執行文件指定的信息替換它自己的代碼,數據等在磁盤上。

這個模型的好處是,shell在改變地址空間之前可以用文件描述符(exec不會被拋出)做一些額外的工作。因此,爲了實現重定向,它將文件描述符0,1和2(分別爲stdin,stdout和stderr)更改爲指向另一個打開的文件,而不是控制檯I/O。您使用dup2來更改這些文件描述符之一的含義,然後執行以啓動新的進程。