2016-03-23 114 views
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。

+0

服務的層次。一旦守護進程啓動(您的pid 647),系統將顯示一個實例,然後根據系統的配置方式,根據需要啓動額外的進程。例如,在代碼的另一部分中啓動一個類似的實例可能會導致多出一個進程,但不需要守護進程的另一個實例。你的'。/ MyApp'已經運行了,不需要另一個進程ID,即使你用它來啓動另一個'udhcpd'實例(pid 648) – ryyker

+0

看起來與你的問題無關,但是一個真的應該使用'fork ()'而不是'vfork()'在任何Linux系統上。請參閱'vfork()'的Linux手冊頁面:「很遺憾,Linux從過去恢復了這個幽靈。」 –

+0

Ryker,當我寫「在我們的代碼的另一部分,我們開始dhcpd ...」上面我的意思是「dhcpcd」(而不是udhcpd)。如上所示,我只啓動一次udhcpd。 – user6103938

回答

0

我相信答案是udhcpd做另一個叉子離開殭屍進程。恢復爲僅執行系統調用並使用PID文件中的PID來終止進程。