在我的应用程序中,我需要启动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 client),它在进程列表中只有一个条目。有人能解释一下区别是什么吗?如果我做错了事情,我该怎么做?
请求的原因是我要求稍后停止udhcpd,似乎我需要停止使用childs pid(647)和从/var/run/udhcpd.pid(648)读取的pid。

最佳答案

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

关于c - Busybox udhcpd vfork启动两个进程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36177998/

10-13 04:55