Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux中的作业控制-希望将控制权返还给终端_Linux_Shell_Job Control - Fatal编程技术网

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

Linux中的作业控制-希望将控制权返还给终端,linux,shell,job-control,Linux,Shell,Job Control,我需要一些关于linux中作业控制的帮助 我在终端上运行我的程序,就像这样 $ ./test.elf & 然后,我的程序/进程将作为后台进程运行 过了一会儿(比方说5秒钟),我键入fg将进程放在前台 过了一会儿(比方说5秒钟),我希望我的程序返回后台进程,并将bash程序作为前台进程,这样我就可以继续使用终端 以下是我的工作: 启动pprogram时,我使用tcgetpgrp函数获取前台进程(bash程序)的组进程id 然后我等待,直到我的进程是前台进程。我使用tcgetpgrp(ST

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

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

$ ./test.elf &
然后,我的程序/进程将作为后台进程运行

过了一会儿(比方说5秒钟),我键入
fg
将进程放在前台

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

以下是我的工作:

  • 启动pprogram时,我使用
    tcgetpgrp
    函数获取前台进程(bash程序)的组进程id
  • 然后我等待,直到我的进程是前台进程。我使用
    tcgetpgrp(STDIN\uu FILENO)
  • 然后我等待约5秒钟
  • 使用
    tcsetpgrp
    我将上面第1点中得到的流程放在前台
  • 问题是,我可以看到我的进程放在后台,bash程序放在前台,但我不能在终端中输入命令。狂欢没有“回来”,它仍然在等待或睡觉

    我知道我可以按Ctrl-z,然后按
    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_前台示例中的最后两行)。我有一些奇怪的行为,因为我在进程之间切换时没有正确解析状态。