Busybox udhcpd vfork启动两个进程

时间:2016-03-23 12:19:00

标签: c linux exec busybox vfork

在我的应用程序中,我需要启动Busybox udhcpd(dhcp服务器),代码如下。当udhcpd启动并运行时,我在进程列表中得到两个版本。 udhcpd正常运行,即为设备分配了IP地址。

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客户端),它只有一个条目进程列表。任何人都可以解释有什么区别,如果我做错了我应该做的事情吗?

询问的原因是我需要稍后停止udhcpd,似乎我需要停止使用childs pid(647)以及从/var/run/udhcpd.pid(648)读取的pid。

1 个答案:

答案 0 :(得分:0)

我相信答案是udhcpd做了另一个离开僵尸进程的分叉。恢复为仅使用PID文件中的PID进行系统调用并终止进程。