我需要一些关于linux中作业控制的帮助。
我从终端运行我的程序,比如
$ ./test.elf &
然后我的程序/进程作为后台进程运行。
过了一会儿(比方说5秒),我输入fg
将我的流程放在前台。
过了一会儿(比方说5秒),我希望我的程序回到后台进程并将bash程序作为前台进程,以便我可以继续使用终端。
以下是我的工作:
tcgetpgrp
函数获取前台进程(bash程序)的组进程ID。tcgetpgrp(STDIN__FILENO)
。tcsetpgrp
我将上面第1点中的过程放在前台。问题是,我可以看到我的进程放在后台,bash程序放在前台,但我无法在终端输入命令。 bash不会“返回”,它仍在等待或睡觉。
我知道我可以按 Ctrl - z 然后bg
但是我不想使用它,因为在 Ctrl - z 被按下我的进程停止,这不好,因为我正在运行“实时”控制应用程序。所以我想在不停止或暂停我的程序的情况下“立即”切换回终端。
很抱歉,如果我对我的问题的描述似乎令人困惑。
有任何意见吗?
答案 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