0

さて、私のLibの一部として、外部プログラムを実行するための「Worker」アプリケーションが必要です。通常、私は次の呼び出しでそれを行います:

system("");

ただし、今回必要なのは次のとおりです。

  • そのプログラムの戻りコード
  • 実行中のプログラムの実行中に動作するアプリケーション

したがって、完全な実装では、擬似コードは次のようになります。

CTask::Run()
{
   m_iReturnCode = -1;

   ExecuteTask(m_strBinaryName);

   while(Task_Executing)
   {
     HeartBeat();
   }

   return m_iReturnCode;
}

明確にするために、私はこれをUnixプラットフォームで実行しています。

ここでの私のオプションは何ですか、 popen / fork ? すでに実行されている優れたソリューションをお持ちで、これに少し光を当てることができる人はいますか?

ご意見ありがとうございます。

4

3 に答える 3

1

fork() (またはスレッドが必要な場合は clone()) でフォークを作成し、1 つのプロセスで execve() または system() を使用してプログラムを実行し、別のプロセスで元のプログラムを実行し続けることができます。

system()戻りコードについては、 call asからでも戻りコードを取得できます。

ret = system("<your_command>");
printf("%d\n", WEXITSTATUS(ret));
于 2013-11-04T12:11:51.093 に答える
1

私は Linux システムを使用しており、スレッド化のためのブーストと、コマンドを実行してその結果を取得するためのパイプを使用しています (ブーストがわからない場合は、必ず確認してください)。

ここでパイプを使用するヒントをstackoverflowで見つけましたが、申し訳ありませんが、正確な質問はもうわかりません。

おねじコードは付けておりません。execute独自のスレッド内でメソッドを開始するだけです。

std::string execute()
{   
std::string result;

// DO NOT INTERRUPT THREAD WHILE READING FROM PIPE
boost::this_thread::disable_interruption di;

// add echo of exit code to command to get the exit code
std::string command = mp_command + "; echo $?";

// open pipe, execute command and read input from pipe
FILE* pipe = popen(command.c_str(), "r");
if (pipe)
{
    char buffer[128];
    while (!feof(pipe))
    {
        if (fgets(buffer, 128, pipe) != NULL)
        {
            std::string currBuffer(buffer);
            result += currBuffer;
        }
    }
}
else
{
    mp_isValid = false;
}

// sleeping busy wait for the pipe to close
while (pclose(pipe) == -1)
{
    boost::this_thread::sleep(boost::posix_time::milliseconds(100));
}

return result;
}
于 2013-11-04T13:20:48.513 に答える
0

ある種のプロセス間またはスレッド間通信が必要です。フォークしたりスレッドを使用したくない場合は、共有ファイルを使用してみてください。子タスク ( によって呼び出されるsystem()) に書き込むためにファイルを開き、終了したら何らかの値 (「finished」など) を書き込み、ファイルを閉じます。親タスクでは、共有ファイルから "finished" を読み取るまでハートビートします。

これは、共有ファイルの代わりにグローバル変数を記述することによっても実行できます。

ただし、共有ファイルまたはグローバル変数を使用するとエラーが発生しやすくなり、そのように機能するかどうかは完全にはわかりません。

于 2013-11-04T12:16:02.570 に答える