我正在Linux中編寫一個基本的shell作爲業餘愛好,我想開始編寫程序執行程序,但不知道如何執行此操作。我見過execp()
及其各種兄弟姐妹,但顯然這迫使內核放棄當前正在運行的進程,在這種情況下是我的shell,並繼續進行新進程。從我的C程序執行不同的程序
所以基本上我需要的是一個函數,我可以用它來調用一個命令,如ls
或cd
讓它執行然後返回到我的shell。
所有幫助表示讚賞。
我正在Linux中編寫一個基本的shell作爲業餘愛好,我想開始編寫程序執行程序,但不知道如何執行此操作。我見過execp()
及其各種兄弟姐妹,但顯然這迫使內核放棄當前正在運行的進程,在這種情況下是我的shell,並繼續進行新進程。從我的C程序執行不同的程序
所以基本上我需要的是一個函數,我可以用它來調用一個命令,如ls
或cd
讓它執行然後返回到我的shell。
所有幫助表示讚賞。
用fork
創建一個新流程,然後致電exec
。
使用這樣的事情:
if (fork()==0) {
execl ("/bin/sh",NULL);
}
這將創建新的進程(已經在運行一個完全相同的副本),然後用新的替換它。 請注意,在CPU不能完全支持虛擬內存的某些環境中,這可能需要一些解決方法,並且您的原始進程非常大以至於無法複製它。
這將打印新過程的輸出,在您的情況下'/ bin/sh'到STDOUT? – 2012-08-03 11:00:47
是的,新運行的進程(即STDOUT和STDIN)的控制檯將與原始進程相同。 – Senna 2012-08-03 11:03:43
好吧,它似乎有點工作。 我在調用該函數時出現此錯誤。 NULL argv [0]通過exec系統調用傳遞。 這是從'execl()'函數調用'ls'命令... – 2012-08-03 11:10:12
ouah的答案基本上是正確的,但它不適用於cd
。你的shell需要實現作爲內置命令(即shell需要包含代碼cd
原因是fork
首先創建當前進程的新副本(shell的運行實例,然後exec用你想要運行的可執行文件覆蓋新進程,當命令結束時,新進程終止並消失,如果你使用cd
這將改變新進程的工作目錄,但離開舊的進程(shell)的工作目錄完全沒有觸動
啊我明白你的意思了。然後我會對'fork()'函數做更多的研究。 – 2012-08-03 11:12:06
好的,所以創建我的shell的新實例或只是一個簡單的程序使用'fork',然後在那個過程中調用'exec'函數? 如果是這樣,我不敢相信我沒有想到! 謝謝。 – 2012-08-03 10:59:05
您先分叉,然後使用exec來調用所需的命令。請注意,這對'cd'不起作用。 – JeremyP 2012-08-03 11:00:44
好的,謝謝,我會再提一些建議,然後測試每種方法。 – 2012-08-03 11:01:52