【问题标题】:How to control SIGTSTP signal to child processes?如何控制子进程的 SIGTSTP 信号?
【发布时间】:2009-10-04 02:40:54
【问题描述】:

我正在写一个shell。它分叉后台和前台进程。我对 SIGTSTP 信号有疑问。因此,在给出 Ctrl ^ Z 之后,会生成 SIGTSTP,因为此信号被传递到我的 shell 及其子进程(我的 shell 已分叉的所有后台和前台进程)。但就像在实际的 shell 中一样,SIGTSTP 只传递给前台进程,而不是后台进程。那么如何控制这种行为意味着阻止信号被发送到我的 shell 的后台进程呢?

我也试过setpgid(),这意味着改变后台进程的pgid。但是一旦进程执行完毕,setpgid() 就会返回错误。

【问题讨论】:

    标签: unix process


    【解决方案1】:

    如果您为SIGTSTP 安装自己的处理程序,您可以控制其传播给您的孩子(或不传播)。由于您正在编写 shell,因此您可能希望使用其他一些信号来执行此操作(至少 SIGINT)。

    在孩子拥有execed 之后不能setpgid 吗?简单,在孩子execs 之前拨打setpgid。之后您不需要更改它 - 每个作业都应该有一个唯一的pgid,并且您应该继续设置终端的控制组以匹配预期的活动作业的pgid

    【讨论】:

    • 我在 exec 之后也需要它。我可能会通过 fg builtin 将后台进程带到foregorund。我已经在做信号处理程序了
    • 你做错了。就像我在最后一段中所说的,给每个工作一个不同的pgid。当您想将工作置于前台时,请使用tcsetpgrp 让该组控制终端。当您想将作业置于后台时,请使用 tcsetpgrp 让您的 shell 对终端进行组控制。
    猜你喜欢
    • 2014-12-09
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2015-05-25
    相关资源
    最近更新 更多