【问题标题】:How can I put my own shell into foreground after waitpid call?waitpid 调用后,如何将自己的 shell 置于前台?
【发布时间】:2016-03-15 10:37:38
【问题描述】:

我正在尝试为我的学校作业制作自己的外壳,在成功的 fork 调用之后,我想将来自 fork() 函数的 pid 放入前台,然后我想将自己的外壳放入后台。然后在waitpid函数之后,我需要把我自己的shell再次放到前台。为此,我认为是这样的:

        if(tcsetpgrp(0, getpgid(pid))!=0)
        perror("Foreground error: ");

        waitpid(pid, NULL, 0);

        if(tcsetpgrp(0, getpgid(shellpid))!=0)
        perror("Foreground error: ");}

但是在新进程完成后,linux shell 会停止我自己的 shell。 例如, ls 命令就是图中的新进程。 Please look at here: for terminal screen shot

【问题讨论】:

  • 相关:How do I get tcsetpgrp() to work in C。当它是后台进程并尝试更改 tty 的 pgrp 时,您的 shell 将停止。修复是(暂时)忽略 SIGTTOU。
  • 感谢您帮助添加“signal(SIGTTOU, SIG_IGN);”在 tcsetpgrp 解决我的问题之前。但是,我需要使用 Ctrl+Z 命令来停止进程,所以当我忽略它时,我不能这样做。
  • Control-Z 向前台进程组发送 SIGTSTP 信号。它具有与 SIGTTOU 类似的效果,但它们是不同的信号。添加忽略 SIGTTOU 的代码行是否会阻止 Control-Z 正常工作?
  • 在添加 sigprocmask 调用之前,Control-Z 是否有效?
  • 你能问这个问题吗?如果可以,请在父子代码中包含执行任何 setpgid、tcsetgrp、fork、waitpid 和 exec* 调用的所有代码。

标签: c linux shell


【解决方案1】:

添加“信号(SIGTTOU,SIG_IGN);”在 tcsetpgrp 解决我的问题之前。 – Ali Can Üstünel

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2010-10-28
    • 1970-01-01
    相关资源
    最近更新 更多