В моем приложении мне нужно запустить Busybox udhcpd (сервер dhcp), код ниже. В то время как 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), так и pid, читаемый из /var/run/udhcpd.pid (648).
Слои службы. После запуска демона (ваш pid 647) система показывает экземпляр, а затем, в зависимости от конфигурации системы, при необходимости запускаются дополнительные процессы. Запуск аналогичного экземпляра в другой части вашего кода может привести к еще одному процессу, но не требует, например, другого экземпляра демона. Ваш './MyApp' уже запущен, нет необходимости в другом идентификаторе процесса, даже если вы использовали его для запуска другого экземпляра' udhcpd' (pid 648) – ryyker
Он не связан с вашей проблемой, но действительно нужно использовать 'fork() ', а не' vfork() 'в любой системе Linux. Распечатайте страницу руководства Linux для 'vfork()': «Очень жаль, что Linux оживил этот призрак из прошлого». –
Ryker, когда я написал «В другой части нашего кода мы начинаем dhcpd ...» выше, я имел в виду «dhcpcd» (а не udhcpd). Я только начинаю udhcpd, как показано выше. – user6103938