2016-03-23 29 views
2

In meiner Anwendung muss ich Busybox udhcpd (dhcp-Server) starten, der Code ist unten. Während udhcpd startet und läuft, erhalte ich zwei Versionen in der Prozessliste. udhcpd läuft korrekt, d. h. zugewiesene IP-Adressen für Geräte.Busybox udhcpd vfork startet zwei Prozesse

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"); 
} 

Protokollausgabe

udhcpd mit PID gestartet: 647 (PID = 528)

PS-Ausgabe

528 root  0:03 ./MyApp 

647 root  0:00 [udhcpd] 

648 root  0:00 udhcpd /var/run/udhcpd.conf 

Nun, wenn ich bei /var/run/udhcpd.pid aussehen es hat die pid von 648. In einem anderen Teil unseres Codes starten wir dhcpcd (dhcp client) mit dem gleichen Code wie oben und es hat nur einen Eintrag in der Prozessliste. Kann jemand erklären, was der Unterschied ist und wenn ich Dinge falsch mache, was ich tun sollte?

Der Grund für die Frage ist, dass ich später udhcpd stoppen muss und es scheint, dass ich aufhören muss, sowohl die Kinder pid (647) und auch die pid aus /var/run/udhcpd.pid (648) zu lesen.

+0

Schichten des Dienstes. Sobald der Daemon gestartet ist (Ihre PID 647), zeigt das System eine Instanz an, dann werden je nach Konfiguration des Systems zusätzliche Prozesse gestartet. Das Starten einer ähnlichen Instanz in einem anderen Teil Ihres Codes kann zu einem weiteren Prozess führen, erfordert jedoch beispielsweise keine weitere Instanz des Daemon. Ihre './MyApp' bereits ausgeführt wird, keine Notwendigkeit für einen weiteren Prozess-ID, auch wenn Sie es verwendet eine andere Instanz von' udhcpd' zu starten (pid 648) – ryyker

+0

es zu einem Problem in keinem Zusammenhang erscheint, aber man sollte wirklich 'Gabel benutzen() 'statt' vfork() 'auf jedem Linux-System. Ziehe die Linux-Handbuchseite für 'vfork()': "Es ist ziemlich bedauerlich, dass Linux dieses Gespenst aus der Vergangenheit wiederbelebt hat." –

+0

Ryker, als ich schrieb "In einem anderen Teil unseres Codes starten wir dhcpd ..." oben meinte ich "dhcpcd" (und nicht udhcpd). Ich starte udhcpd nur einmal wie oben gezeigt. – user6103938

Antwort

0

Ich glaube, die Antwort ist udhcpd macht eine andere Gabel einen Zombie-Prozess verlassen. Zurückgekehrt, um nur einen Systemaufruf auszuführen und den Prozess mithilfe der PID in der PID-Datei zu beenden.