2

私のアプリケーションでは、Busybox udhcpd (dhcp サーバー) を起動する必要があります。コードは以下のとおりです。udhcpd が起動して実行されると、プロセス リストに 2 つのバージョンが表示されます。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 クライアント) を開始しますが、プロセス リストにはエントリが 1 つしかありません。誰かが違いを説明できますか?もし私が間違ったことをしているなら、私は何をすべきですか?

質問の理由は、後で udhcpd を停止する必要があり、子の pid (647) と /var/run/udhcpd.pid (648) から読み取った pid の両方の使用を停止する必要があるようです。

4

1 に答える 1

0

答えは、udhcpd が別の fork を行い、ゾンビ プロセスを残すことだと思います。システム コールを実行し、PID ファイルの PID を使用してプロセスを強制終了するだけに戻りました。

于 2016-03-24T16:07:14.770 に答える