Linux中的作业控制-希望将控制权返还给终端
我需要一些关于linux中作业控制的帮助 我在终端上运行我的程序,就像这样Linux中的作业控制-希望将控制权返还给终端,linux,shell,job-control,Linux,Shell,Job Control,我需要一些关于linux中作业控制的帮助 我在终端上运行我的程序,就像这样 $ ./test.elf & 然后,我的程序/进程将作为后台进程运行 过了一会儿(比方说5秒钟),我键入fg将进程放在前台 过了一会儿(比方说5秒钟),我希望我的程序返回后台进程,并将bash程序作为前台进程,这样我就可以继续使用终端 以下是我的工作: 启动pprogram时,我使用tcgetpgrp函数获取前台进程(bash程序)的组进程id 然后我等待,直到我的进程是前台进程。我使用tcgetpgrp(ST
$ ./test.elf &
然后,我的程序/进程将作为后台进程运行
过了一会儿(比方说5秒钟),我键入fg
将进程放在前台
过了一会儿(比方说5秒钟),我希望我的程序返回后台进程,并将bash程序作为前台进程,这样我就可以继续使用终端
以下是我的工作:
tcgetpgrp
函数获取前台进程(bash程序)的组进程idtcgetpgrp(STDIN\uu FILENO)
tcsetpgrp
我将上面第1点中得到的流程放在前台bg
,但我不想使用它,因为按下Ctrl-z后,我的进程停止了,这不好,因为我正在运行一个“实时”控制应用程序。因此,我想在不停止或暂停程序的情况下“立即”切换回终端
对不起,如果我对我的问题的描述令人困惑
有什么意见吗?我必须承认,如果这是您正在寻找的解决方案,我不是100%,但是使用GNU屏幕实用程序呢?您的应用程序可以在一个屏幕上运行,而另一个屏幕上有可用的终端。在屏幕之间切换就像一个键盘快捷键一样简单。可以找到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 '\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
为什么不使用一个专用终端,让进程在前台运行,而在另一个终端上执行其他业务?是的,这就是将要发生的事情:我使用一个专用终端来测试和调试我的程序(在前台)但是,当我完成时,我想在不停止程序或按ctrl-z键的情况下终止终端,然后“取消”如果终止终端,怎么可能将控制权还给它呢?但是当我的进程处于前台时,我如何回到终端键入“取消”(不使用ctrl-z键停止进程)?我基本上想表演“bg”和“fg”,但在我的节目中。嗯,这是个好问题。这个应用程序是只提供输出还是交互式的?如果它只提供输出,一种解决方案(尽管可能有些过分)是分叉进程并使用命名管道向类似客户端的应用程序提供输出。它是交互式的(从stdin读取命令)。线程从stdin读取命令并在stdout上输出信息。当它收到某个命令时,它必须“退出”终端并将stdin、stdout返回给终端,但整个过程必须仍在运行。嗯,您确定正确使用了tcget/setgrp吗?即,遵循说明(特别是本put_job_in_前台示例中的最后两行)。我有一些奇怪的行为,因为我在进程之间切换时没有正确解析状态。