私のアプリケーションはサブプロセス プログラムを開始して、QuickTime フレームワークfork()
とパイプを使用してビデオを読み取ります。サブプロセスは、ビジーでない場合、つまりusleep
入力があるまで待ちループに入ります。サブプロセスは GUI アプリケーションではなく、C++ で記述されています。
MSVC コーデックを使用してコード化された AVI ビデオを開くと、アプリケーション アイコンの 2 つ目のコピーがドックに表示され、バウンスします。アクティビティ モニターで約 30 秒後に、CPU が ~0% のように見えても、サブプロセスが「応答していません」に変わることがわかります。サブプロセスはまだ実行中で、応答しています。アクティビティモニターが別のことを言っているだけです。
gdb attach
サブプロセスの状態を見ると、その出力を介して確認するか、確認します。すべてがうまく見えます。サブプロセスに、ファイルを閉じて別のファイルを開いて引き続き使用するように指示できます。その時点で、跳ねるドック アイコンが消え、プロセスが応答なしとしてマークされなくなります。
OSX が私のサブプロセスがクラッシュした (?) と考えているようですが、例外を検出できません。
ドックにアイコンが表示され、バウンスし、応答していないとマークされているサブプロセスを停止するにはどうすればよいですか?
これは、サブプロセスとの通信をセットアップする方法です。
#include <unistd.h>
#define READ 0
#define WRITE 1
// Start process
pid_t popen2(const char *command, char * const argv[], int *infp, int *outfp)
{
int p_stdin[2], p_stdout[2];
pid_t pid;
// Set up pipes
if(pipe(p_stdin) != 0 || pipe(p_stdout) != 0)
return(-1);
pid = fork();
if(pid < 0)
return(pid);
else if(pid == 0)
{
// Set up communication via stdin/out
close(p_stdin[WRITE]);
dup2(p_stdin[READ], READ);
close(p_stdout[READ]);
dup2(p_stdout[WRITE], WRITE);
execvp(command, argv); // run subprocess
perror("execvp");
exit(1);
}
// Provide pointers to the file descriptors to the caller
if(infp == NULL)
close(p_stdin[WRITE]);
else
*infp = p_stdin[WRITE];
if(outfp == NULL)
close(p_stdout[READ]);
else
*outfp = p_stdout[READ];
return(pid);
}
の詳細については、この SO の質問を参照してくださいpopen2()
。
注:このコードが問題の原因である場合とそうでない場合があります。第一段階として、何が原因なのかを突き止めたいと思います。