[英]Running a new child process in background C linux
我正在嘗試在后台運行新流程,因此可以繼續使用父流程。
我先用fork然后用execl。 我試圖將參數&添加到execl命令,但它不起作用:
execl("newproc","newproc","arg1","&",NULL);
有什么解決辦法嗎?
自從您使用fork
以來,孩子將在后台運行。 子級將繼續與父級並行運行(如果exec
成功)。 如果您關心子進程是否成功(您的代碼應該成功),則最終應調用waitpid
來收集其退出狀態。 否則,您應該調用fork
兩次 ,並在不wait
子進程的情況下退出中間進程,以便init
采用孫進程。
正如@mah所說, &
是不必要的。 但是,這條線還需要改變。 execl
是一個可變參數函數,因此函數原型不需要考慮將參數轉換為正確的類型。 因此,最后一個參數應該以正確的類型傳遞-只需將其更改為(char*)NULL
。
您提到您的代碼無效。 雖然這可能只是因為虛假的&
,也可能是因為第一個參數。 execl
函數不會在$PATH
搜索指定的程序,因此,除非newproc
實際上在當前目錄中,否則此execl()
調用將返回。 當execl
返回時,始終表示存在問題。 解決此問題的最簡單方法是使用execlp()
而不是execl()
。 另一種方法是將絕對路徑指定為第一個參數。 您甚至可以將相對路徑指定為第一個參數,但這很少有用。
&
不是命令參數,它是shell用來在后台運行命令的標志。 在這種情況下,您要執行外殼的工作...刪除&
。 由於您聲明了自己的調用fork()
,只要在fork返回后僅在子進程中執行execl()
,您就已經在后台運行了。
問題在於&
不是程序的命令行選項。 相反,它只是一種特殊的shell語法,它在后台放置了一個命令。 后台程序的顯着特征是它們沒有連接到終端,並且終端不等待該過程完成。 正確的函數是daemon()
。 做一個man daemon
來閱讀如何使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.