簡體   English   中英

在后台C linux中運行新的子進程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM