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



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

我在终端上运行我的程序,就像这个

$ ./test.elf &

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

过了一段时间(比如说5秒钟),我键入fg将我的进程置于前台。

过了一段时间(比如说5秒钟),我希望我的程序回到后台进程,并将bash程序作为前台进程,这样我就可以继续使用终端了。

我是这样做的:

  1. 启动pprogram时,我使用tcgetpgrp函数获取前台进程(bash程序)的组进程id
  2. 然后我等待,直到我的进程是前台进程。我使用tcgetpgrp(STDIN__FILENO)
  3. 然后我等待约5秒
  4. 使用tcsetpgrp,我将上面第1点中得到的过程放在前台

问题是,我可以看到我的进程被放在后台,bash程序被放在前台,但我无法在终端中输入命令。bash没有"返回",它仍然在等待或睡觉。

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

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

有什么意见吗?

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

另一个选项可能是disown命令(据我所知,仅在Bash中可用)。它可以让你把一个进程放在后台运行,这里有一些文档。

您可以在脚本中添加以下内容。当你在后台处理时,它会给你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 'ttt' "Unix Helper Utility"
echo -e 'ttt' "==================="
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