2012-02-24 24 views
3

Linuxのジョブ制御に関する助けが必要です。Linuxのジョブ制御 - 端末に制御を戻したい

この

$ ./test.elf & 

私のプログラム/プロセスはバックグラウンド・プロセスとして実行されているように私は、ターミナルの外に私のプログラムを実行します。

しばらくして(私は5秒と言う)、私はfgと入力してプロセスをフォアグラウンドに入れました。

しばらくすると(私のプログラムはバックグラウンドプロセスに戻り、バックグラウンドプロセスとしてbashプログラムを置いて、ターミナルの使用を継続できるようにします)。

  1. 私pprogramをstartng、私はtcgetpgrp機能を使用して、フォアグラウンドプロセス(bashのプログラム)のグループプロセスIDを取得します:ここで

    は、私が何をすべきかです。

  2. 私はプロセスがフォアグラウンドプロセスであるのを待っています。私はtcgetpgrp(STDIN__FILENO)を使用します。
  3. 私はそれから5秒待つ
  4. tcsetpgrpを使って、上記のポイント1のプロセスをフォアグラウンドに入れました。

問題は、自分のプロセスがバックグラウンドとフォアグラウンドのbashプログラムに置かれていることがわかりましたが、端末にコマンドを入力できません。 bashは "戻る"ではなく、まだ待っている、または眠っています。

私はCtrlキー押すことができます知っている - Z、その後bgを私は後、Ctrlのでことを使用したくない - Zが押されている私のプロセスが停止され、それがために良いではありません私は "リアルタイム"制御アプリケーションを実行しています。だから私はプログラムを止めたり一時停止させたりせずに "即座に"端末に戻りたいと思っています。

申し訳ありませんが、私の問題の説明が混乱しているようです。

コメントがありますか?

+1

? – mouviciel

+0

はい、それは起こります:私は私のプログラムをテストし、デバッグするために専用の端末を使用していますが(フォアグラウンド中)、終了したらプログラムを止めずにCtrl-Zを押してから端末を終了し、 – joeks

+0

ターミナルを終了すると、そのターミナルに制御を戻すにはどうすればいいですか? – mouviciel

答えて

1

これはあなたが探している解決策であれば100%ではないことを認めなければなりませんが、GNU Screenユーティリティを使用するとどうなりますか?あなたのアプリは1つの画面で実行され、他の画面には利用可能な端末があります。画面間の切り替えは、キーボードショートカットと同じくらい簡単です。 GNU画面のドキュメントはhereです。

もう1つのオプションは、disownコマンド(私が知る限り、Bashでのみ利用可能)です。プロセスをバックグラウンドで実行できるようにします。ドキュメントの一部はhereです。

+0

しかし、私のプロセスがフォアグラウンドになったら、ターミナルに戻って「disown」と打ち込んでください(ctrl-zでプロセスを停止することなく)。基本的に私のプログラムでは「bg」と「fg」を実行したいと思っています。 – joeks

+0

これは良い質問です。このアプリケーションは出力のみを提供するのか、それとも対話型ですか?それが出力のみを提供するのであれば、1つの解決策は、過剰な処理であってもプロセスをフォークし、名前付きパイプを使用してクライアントのようなアプリケーションに出力を提供することです。 –

+0

これは対話式です(stdinからコマンドを読み取ります)。スレッドはstdinからコマンドを読み込み、stdoutの情報を出力します。特定のコマンドを受け取ったら、ターミナルを "終了"してstdin、stdoutを端末に戻す必要がありますが、プロセス全体がまだ実行されている必要があります – joeks

0

スクリプトに次のものを追加できます。あなたのバックグラウンドでの処理中に5秒間端末を戻します。

timelimit=5; ## The time limit in seconds 
NEW_PROMPT_COMMAND="; if [[ \\\$SECONDS -gt $timelimit ]]; then echo \\\"---Timelimit hit, shutting down shell---\\\"; flush_keyboard_buffer; exit; fi"; 
touch ~/.bashrc_timelimit; 
cp ~/.bashrc ~/.bashrc_timelimit; 
(cat ~/.bashrc; echo -e "\nPROMPT_COMMAND+=\"$NEW_PROMPT_COMMAND\"") > ~/.bashrc_timelimit; 
bash --rcfile ~/.bashrc_timelimit; 

打者の理解のために、この実行中のスクリプトを試してみてください -

あなたは別の端末では、あなたの他のビジネスを行う一方で、あなたが、あなたのプロセスがフォアグラウンドで実行している専用端末を使用していないのはなぜ
function pause(){ 
read -n 1 -p "$*" 
} 
clear 
until [ "selection" = "0" ] ; do 
echo " " 
echo -e '\t\t\t' "Unix Helper Utility" 
echo -e '\t\t\t' "===================" 
echo " " 
echo "[1] List File names in current directory" 
echo "[2] Show Time and Date" 
echo "[3] Process ID" 
echo "[4] Send this menu to Background" 
echo "[0] Exit" 
echo " " 
echo "Please pick an option listed above: " 
read selection 
echo " " 
case $selection in 
    1) clear 
    echo " Current Directory list:" 
    ls 
    pause 
    clear ;; 
    2) clear 
    date 
    pause 
    clear ;; 
    3) clear 
    echo "option 3" 
    pause 
    clear ;; 
    4) clear 
    timelimit=5; ## The time limit in seconds 
    NEW_PROMPT_COMMAND="; if [[ \\\$SECONDS -gt $timelimit ]]; then echo \\\"---Timelimit hit, shutting down shell---\\\"; flush_keyboard_buffer; exit;    fi"; 
    touch ~/.bashrc_timelimit; 
    cp ~/.bashrc ~/.bashrc_timelimit; 
    (cat ~/.bashrc; echo -e "\nPROMPT_COMMAND+=\"$NEW_PROMPT_COMMAND\"") > ~/.bashrc_timelimit; 
    bash --rcfile ~/.bashrc_timelimit; 
    clear ;; 
    0) clear 
    exit 
    esac 
done 
関連する問題