6

他のプログラムのウォッチドッグとして機能する C++ プログラムがあります。プロセスが実行されていないことを検出すると、 を介してプロセスを再起動しsystemます。問題は、ウォッチドッグ プロセスを強制終了すると、それが起動したプロセスも停止することです。

void* ProcessWatchdog::worker(void* arg)
{
    //Check if process is running
    if( !processRunning )
        system("processName /path/to/processConfig.xml &");
}

新しい子プロセスが正しく開始され、問題なく実行されます。しかし、親 (現在はこのProcessWatchdogプロセス) が死ぬと、子も死にます。親から完全に独立した子プロセスを生成するにはどうすればよいですか?

pclosepopen、プロセスを開始するシェル スクリプトの実行、およびその他のいくつかの戦術を使用してみましたが、役に立ちませんでした。子プロセスのシグナルを無視してSIGHUPいますが、それでも死んでしまいます。

理想的には、親から完全に独立したプロセスを開始するようにシステムに指示したいと思います。私は子供がtrace子供で終わること、そしてそれ/システムがProcessWatchdog最初にそれを始めたことを知らないことを望んでいます.

これを行う方法はありますか?

Linux の C++ でこれを書いています。

4

6 に答える 6

3

system(...)マルチスレッドセーフではないため、使用しないでください。

int pid = fork();

if(pid==0)
{
  int rc = execv("processname", "/path/to/processConfig.xml &");
  if(rc == -1)
  {
    printf(stderr, "processname failed to start. %d", errno);
  }
  ...
}
else
{
  //continue with the parent
}
于 2013-07-11T17:06:18.660 に答える
2

システムの使用は避けるべきです。

set-user-ID または set-group-ID 権限を持つプログラムから system() を使用しないでください。一部の環境変数の奇妙な値がシステムの整合性を破壊するために使用される可能性があるためです。代わりに exec(3) ファミリの関数を使用してください。

また、戻り値などを確認したい場合

ただ行くexecl

#include <unistd.h>
#include <stdlib.h>
pid_t pid = fork()
if (pid == -1)
{
   exit(EXIT_FAILURE);
}
else if (pid == 0)
{
  if (execl("processname", "processname", "/path/to/processConfig.xml", NULL) == -1)
    exit(EXIT_FAILURE); 
}
else
...
于 2013-07-11T17:19:48.610 に答える
0

daemon(3)ライブラリ関数 (ネストされた 2 つのfork(2) syscallを内部的に使用)に興味があるかもしれません。その後、関連するexecve(2)システムコール (または関連するexec(3)関数) を使用します...

詳細については、 Advanced Linux Programmingをお読みください。

于 2013-07-11T20:20:15.963 に答える
0

https://github.com/wALLe/wash/blob/master/src/wash.cppに execvp の例があります。コマンドライン引数を渡すことは、unistd の exec* 関数で問題になる場合があり、渡された環境を取得するのに多少の作業が必要になる場合があります。とにかく、それが役に立てば幸いです...

于 2015-03-16T12:40:31.293 に答える