数日間検索した後、質問する時が来ました。環境はUbuntu12.04/Gnomeです。
私はubuntuボックスでいくつかの組み込みコードを開発し、組み込みプロセッサに移植する前に、その環境でできる限りテストしています。現在のルーチンはリアルタイムの高速フーリエ変換であり、gnuplotを使用して結果を表示したいと思います。そのため、テストコードとgnuplotを同時にフォアグラウンドで実行し、パイプを介して通信する必要があります。
私は通常のpopen()呼び出しを行いましたが、それは1つのことを除いて機能しました。子のstdin(gnuplot)はまだコンソールに接続されています。親プロセスと競合しています。親プロセスは、その動作を変更するためにキーストロークを受け取る必要があります。親がキーストロークを取得することもあれば、gnuplotが取得することもあります。
だから私はfork/execパスを試しました。具体的には
pid_t pg = tcgetpgrp(1); // get process group associated with stdout
cerr << "pid_t pg = " << pg << endl;
cerr << "process pid is " << getpid() << endl;
if (pipe(pipefd) == -1) {// open the pipe
cerr << "pipe failure" << endl;
exit(3);
} // if pipe
cpid = fork();
if (cpid == -1) {
cerr << "fork failure" << endl;
exit(1);
}
if (cpid == 0) { // this is the child process
if (tcsetpgrp(1, pg) == -1) { // this should set the process associated with stdin (gnuplot) with the
cerr << "tcsetgrp failed" << endl; // foreground terminal.
exit(7);
}
close(pipefd[1]); // close child's writing handle
if (pipefd[0] != STDIN_FILENO) { // this changes the file descripter of stdin back to 0
if ( dup2(pipefd[0], STDIN_FILENO) != STDIN_FILENO) {
cerr << "dup2 error on stdin" << endl;
exit(6);
}
}
if (execl("/usr/bin/gnuplot", "gnuplot", "-background", "white", "-raise", (char *) NULL)) {
cerr << "execl failed" << endl;
exit(2);
} else // if exec
close(pipefd[0]); // close parent's reading handle
} // if cpid
// back in parent process
これは、私が期待するようにgnuplotを起動します。gnuplotが通常どおりに1つのコアのすべてのリソースを消費していることがわかります。問題は、画面にグラフが表示されないことです。
だから私の質問は、子プロセスを開始し、それをコンソールから完全に切り離して、キーストロークを取得せず、gnuplotの出力を表示しないようにするにはどうすればよいですか?