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.
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
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." –
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