1

数日間検索した後、質問する時が来ました。環境は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の出力を表示しないようにするにはどうすればよいですか?

4

0 に答える 0