发送信号给后台进程

4

我应该发送哪个信号给后台进程以使其移动到前台?SIGTTIN,SIGTOU还是其他信号?


1
需要更多的信息,比如使用什么框架等等。 - Justin R.
4个回答

20

信号并不直接控制作业是在前台还是后台运行。通常情况下,作业是由一个shell控制的。

例如,在bash中执行以下命令:

pax> sleep 3600 &
pax> jobs

你将看到如下输出:

[1]+  Running                 sleep 3600 &

然后,您可以使用以下命令将该作业带回前台:

pax> fg %1
sleep 3600
(and the terminal waits).
使用CTRLZ确实会向进程发送信号 (SIGSTOP),并将其置于后台,但唯一可以改变状态的信号是SIGCONT(继续执行):
pax> fg %1
sleep 3600
^Z
[1]+  Stopped                 sleep 3600
pax> jobs
[1]+  Stopped                 sleep 3600
pax> kill -CONT %1
pax> jobs
[1]+  Running                 sleep 3600 &

这将指示进程重新开始运行,但它不会使其回到前台。为此,您需要使用fg命令。

最好将信号(影响进程)和前/后台(影响启动进程的shell,通过确定是否等待该进程等其他因素)分开考虑。


你可以像这样在C语言中发送一个信号来继续挂起的进程:kill(1453, SIGCONT);我需要能够将后台进程移动到前台的信号名称,类似于SIGCONT。 :) - user224416
4
没有这个功能。简单明了地说,前景/背景不是进程的属性,而是启动进程的* shell *的属性。 Shell 控制这个方面。您可以发送 SIGCONT 以启动进程运行(如果使用 SIGSTOP 停止),但没有信号可以使进程强制进入前景,因为它根本没有这个能力。 - paxdiablo
3
好的,我会尽力为您进行翻译。“@gurudoglu - 这就像试图给电视广播公司打电话并要求他们开启你的电视一样。这是没有电话号码的。幸运的是...” (说明:已经翻译成中文) - martin clayton

7

好的回答 - 但问题仍然根本错误 :) - John Weldon
2
这些信号都不会将进程移至前台。SIGCONT 会在进程被 SIGSTOP 停止后使其恢复。当进程尝试在后台读取或写入时,SIGTT 仅会传递给进程。它们并不会将进程置于前台,事实上它们的默认操作就像你发送了一个 SIGSTOP 一样,只是停止进程。你仍然需要使用 SIGCONT 让它们在后台继续运行,或者从 shell 中将它们切换到前台。 - paxdiablo

2

据我所知,在任何操作系统中都没有办法使用信号将进程置于前台。

我认为你只能使用fg将进程置于前台。

前台只在控制台的上下文中相关,信号无法告诉进程应该将哪个控制台置于前台...


1

假设您正在Unix上,并从shell启动了进程,您可以键入以下内容

  • 停止进程 :: ^Z
  • 将进程移至后台 :: bg
  • 返回前台 :: fg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接