【问题标题】:Busybox udhcpd vfork starts two processesBusybox udhcpd vfork 启动两个进程
【发布时间】:2016-07-10 17:36:38
【问题描述】:

在我的应用程序中,我需要启动 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,看来我需要停止使用孩子的 pid (647) 以及从 /var/run/udhcpd.pid (648) 读取的 pid。

【问题讨论】:

  • 服务层。一旦启动守护进程(您的 pid 647),系统会显示一个实例,然后根据系统的配置方式,根据需要启动其他进程。例如,在代码的另一部分启动类似的实例可能会导致多一个进程,但不需要另一个守护进程实例。你的 ./MyApp 已经在运行,不需要另一个进程 ID,即使你用它来启动另一个 udhcpd 实例(pid 648)
  • 这似乎与您的问题无关,但在任何 Linux 系统上确实应该使用 fork() 而不是 vfork()。引用vfork() 的 Linux 手册页:“很不幸的是,Linux 从过去复活了这个幽灵。”
  • Ryker,当我在上面写“在我们代码的另一部分中,我们启动 dhcpd ...”时,我的意思是“dhcpcd”(而不是 udhcpd)。如上所示,我只启动 udhcpd 一次。

标签: c linux exec busybox vfork


【解决方案1】:

我相信答案是 udhcpd 会进行另一个分叉,从而留下一个僵尸进程。恢复为仅执行系统调用并使用 PID 文件中的 PID 杀死进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2014-01-31
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多