2012-08-03 27 views
-1

我正在Linux中編寫一個基本的shell作爲業餘愛好,我想開始編寫程序執行程序,但不知道如何執行此操作。我見過execp()及其各種兄弟姐妹,但顯然這迫使內核放棄當前正在運行的進程,在這種情況下是我的shell,並繼續進行新進程。從我的C程序執行不同的程序

所以基本上我需要的是一個函數,我可以用它來調用一個命令,如lscd讓它執行然後返回到我的shell。

所有幫助表示讚賞。

回答

1

fork創建一個新流程,然後致電exec

+0

好的,所以創建我的shell的新實例或只是一個簡單的程序使用'fork',然後在那個過程中調用'exec'函數? 如果是這樣,我不敢相信我沒有想到! 謝謝。 – 2012-08-03 10:59:05

+0

您先分叉,然後使用exec來調用所需的命令。請注意,這對'cd'不起作用。 – JeremyP 2012-08-03 11:00:44

+0

好的,謝謝,我會再提一些建議,然後測試每種方法。 – 2012-08-03 11:01:52

1

使用這樣的事情:

if (fork()==0) { 
    execl ("/bin/sh",NULL); 
} 

這將創建新的進程(已經在運行一個完全相同的副本),然後用新的替換它。 請注意,在CPU不能完全支持虛擬內存的某些環境中,這可能需要一些解決方法,並且您的原始進程非常大以至於無法複製它。

+0

這將打印新過程的輸出,在您的情況下'/ bin/sh'到STDOUT? – 2012-08-03 11:00:47

+0

是的,新運行的進程(即STDOUT和STDIN)的控制檯將與原始進程相同。 – Senna 2012-08-03 11:03:43

+0

好吧,它似乎有點工作。 我在調用該函數時出現此錯誤。 NULL argv [0]通過exec系統調用傳遞。 這是從'execl()'函數調用'ls'命令... – 2012-08-03 11:10:12

2

ouah的答案基本上是正確的,但它不適用於cd。你的shell需要實現作爲內置命令(即shell需要包含代碼cd

原因是fork首先創建當前進程的新副本(shell的運行實例,然後exec用你想要運行的可執行文件覆蓋新進程,當命令結束時,新進程終止並消失,如果你使用cd這將改變新進程的工作目錄,但離開舊的進程(shell)的工作目錄完全沒有觸動

+0

啊我明白你的意思了。然後我會對'fork()'函數做更多的研究。 – 2012-08-03 11:12:06