2016-03-23 2 views
2

В моем приложении мне нужно запустить 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).

+0

Слои службы. После запуска демона (ваш pid 647) система показывает экземпляр, а затем, в зависимости от конфигурации системы, при необходимости запускаются дополнительные процессы. Запуск аналогичного экземпляра в другой части вашего кода может привести к еще одному процессу, но не требует, например, другого экземпляра демона. Ваш './MyApp' уже запущен, нет необходимости в другом идентификаторе процесса, даже если вы использовали его для запуска другого экземпляра' udhcpd' (pid 648) – ryyker

+0

Он не связан с вашей проблемой, но действительно нужно использовать 'fork() ', а не' vfork() 'в любой системе Linux. Распечатайте страницу руководства Linux для 'vfork()': «Очень жаль, что Linux оживил этот призрак из прошлого». –

+0

Ryker, когда я написал «В другой части нашего кода мы начинаем dhcpd ...» выше, я имел в виду «dhcpcd» (а не udhcpd). Я только начинаю udhcpd, как показано выше. – user6103938

ответ

0

Я считаю, что ответ udhcpd делает еще одну вилку, оставляя процесс зомби. Вернулся к простому системному вызову и убил процесс, используя PID в PID-файле.

 Смежные вопросы

  • Нет связанных вопросов^_^