2012-06-10 89 views
0

我想在後臺運行一個新進程,這樣就可以繼續使用父進程。在後臺運行一個新的子進程C linux

我用fork然後execl。我嘗試添加到execl的命令參數&,但它不工作:

execl("newproc","newproc","arg1","&",NULL); 

有沒有什麼解決辦法嗎?

回答

2

問題是&不是程序的命令行選項。相反,它只是一個特殊的shell語法,它將命令放在後臺。後臺程序的顯着特徵是它們沒有連接到終端,並且終端不等待該過程完成。正確的功能是daemon()。做一個man daemon來了解它是如何使用的。

+0

守護進程()是我在找的東西。 thx – user655561

+1

抱歉挑剔:'守護進程(3)'不是*系統調用*,它是一個庫函數(通過'fork'和'close'系統調用實現 - 在'man'頁面的第2部分列出)。事實上,守護進程是適合使用的功能。 –

+0

嗯,你似乎是對的。我從事UNIX編程已經有一段時間了,但我記得它顯示爲系統調用,顯然不正確。無論如何,適當的參考文獻是史蒂文斯的書,它注意到了這種等價性(iirc,因爲我的手冊頁沒有) –

2

&不是一個命令參數,它是shell用來知道在後臺運行命令的標誌。在這種情況下,您正在執行shell的工作...刪除&。既然你聲明你已經調用了fork(),只要你在fork返回後在子進程中只執行execl(),你就已經在後臺運行了。

4

自從您使用fork後,該孩子將在後臺運行。孩子將繼續與父母並行(如果exec成功)。如果你關心子進程是否成功(和你的代碼應該),你最終應該調用waitpid來收集其退出狀態。否則,您應該撥打fork兩次並且爲兒童設置中間程序退出而不是wait ing,以便init採用孫子過程。

正如@mah所說,&是不必要的。但是該線需要另一個改變; execl是一個可變參數函數,因此函數原型不會將參數轉換爲正確的類型。因此,最終的參數應該作爲正確的類型傳遞 - 只需將其更改爲(char*)NULL即可。

你提到你的代碼沒有工作。雖然這可能是因爲虛假的&,但也可能是因爲第一個參數。 execl函數不會搜索指定程序的$PATH,因此除非newproc實際位於當前目錄中,否則將調用execl()調用。當execl返回時,總是表示存在問題。解決此問題的最簡單方法是使用execlp()而不是execl()。另一種方法是將絕對路徑指定爲第一個參數。你甚至可以指定一個相對路徑作爲第一個參數,但這很少有用。