Linux中的作业控制 - 希望将控制权交还给终端

时间:2012-02-24 08:35:24

标签: linux shell job-control

我需要一些关于linux中作业控制的帮助。

我从终端运行我的程序,比如

$ ./test.elf &

然后我的程序/进程作为后台进程运行。

过了一会儿(比方说5秒),我输入fg将我的流程放在前台。

过了一会儿(比方说5秒),我希望我的程序回到后台进程并将bash程序作为前台进程,以便我可以继续使用终端。

以下是我的工作:

  1. 当启动我的pprogram时,我使用tcgetpgrp函数获取前台进程(bash程序)的组进程ID。
  2. 然后我等到我的进程是前台进程。我使用tcgetpgrp(STDIN__FILENO)
  3. 我等了~5秒
  4. 使用tcsetpgrp我将上面第1点中的过程放在前台。
  5. 问题是,我可以看到我的进程放在后台,bash程序放在前台,但我无法在终端输入命令。 bash不会“返回”,它仍在等待或睡觉。

    我知道我可以按 Ctrl - z 然后bg但是我不想使用它,因为在 Ctrl - z 被按下我的进程停止,这不好,因为我正在运行“实时”控制应用程序。所以我想在不停止或暂停我的程序的情况下“立即”切换回终端。

    很抱歉,如果我对我的问题的描述似乎令人困惑。

    有任何意见吗?

2 个答案:

答案 0 :(得分:1)

我必须承认,如果这是您正在寻找的解决方案,我不是100%,但是使用GNU Screen实用程序呢?您的应用可以在一个屏幕上运行,而另一个屏幕中有一个可用的终端。在屏幕之间切换就像一个键盘快捷键一样简单。可以找到GNU屏幕的文档here

另一个选项可能是disown命令(据我所知,仅在Bash中可用)。它允许您将进程放在后台运行,并找到一些文档here

答案 1 :(得分: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