3

我需要一些有关 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但我不想使用它,因为按下Ctrl-之后z我的进程停止了,这不好,因为我正在运行“实时”控制应用程序。所以我想“立即”切换回终端而不停止或暂停我的程序。

对不起,如果我对我的问题的描述似乎令人困惑。

任何意见?

4

2 回答 2

1

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

另一种选择可能是 disown 命令(据我所知,仅在 Bash 中可用)。它让您可以在后台运行一个进程,并且可以在此处找到一些文档。

于 2012-02-24T08:56:14.573 回答
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
于 2012-02-24T09:10:18.637 回答