2
在我的應用程序中,我需要啓動Busybox udhcpd(dhcp server),代碼如下。雖然udhcpd確實啓動並運行,但我在進程列表中獲得了兩個版本。 udhcpd運行正常,即分配給設備的IP地址。Busybox udhcpd vfork啓動兩個進程
pid_t forked_pid = vfork();
if (forked_pid == 0)
{
// Child process, execute udhcpd.
execl("/usr/bin/udhcpd",
"udhcpd",
"/var/run/udhcpd.conf", // the location of the udhcpd config file
NULL);
}
else if (forked_pid > 0)
{
// Parent process, record the childs pid
m_udhcpd_pid = forked_pid;
log(Log_Info, "UDHCPD started with PID: %d (PID=%d)", forked_pid, getpid());
}
else
{
log(Log_Warning, "Failed to start UDHCPD");
}
日誌輸出
UDHCPD開始與PID:647(PID = 528)
PS輸出
528 root 0:03 ./MyApp
647 root 0:00 [udhcpd]
648 root 0:00 udhcpd /var/run/udhcpd.conf
現在,如果我看/var/run/udhcpd.pid它的pid爲648.在我們的代碼的另一部分,我們使用與上面相同的代碼啓動dhcpcd(dhcp client),並且它在進程列表中只有一個條目。任何人都可以解釋什麼是不同的,如果我做錯了我應該做的事情?
問的原因是我需要稍後停止udhcpd,似乎我需要停止使用childs pid(647)以及從/var/run/udhcpd.pid(648)中讀取的pid。
服務的層次。一旦守護進程啓動(您的pid 647),系統將顯示一個實例,然後根據系統的配置方式,根據需要啓動額外的進程。例如,在代碼的另一部分中啓動一個類似的實例可能會導致多出一個進程,但不需要守護進程的另一個實例。你的'。/ MyApp'已經運行了,不需要另一個進程ID,即使你用它來啓動另一個'udhcpd'實例(pid 648) – ryyker
看起來與你的問題無關,但是一個真的應該使用'fork ()'而不是'vfork()'在任何Linux系統上。請參閱'vfork()'的Linux手冊頁面:「很遺憾,Linux從過去恢復了這個幽靈。」 –
Ryker,當我寫「在我們的代碼的另一部分,我們開始dhcpd ...」上面我的意思是「dhcpcd」(而不是udhcpd)。如上所示,我只啓動一次udhcpd。 – user6103938