【问题标题】:How to judge whether a process is running in the foreground(Linux)?如何判断一个进程是否在前台运行(Linux)?
【发布时间】:2021-10-15 02:26:30
【问题描述】:

最近我一直在尝试用c实现一个作业控制shell,我得到了上述问题。

当我输入一个命令时,它会在前台执行,同时在它完成之前我无法对终端做任何事情,换句话说,它控制着终端。

回到问题,gnu 文档给出了一个展示,它测试 stdin_fileno 是否是一个 tty。以下是我的问题:

  1. 这是否意味着当一个进程在前台运行时,它也在控制终端?如果不是,有什么区别?
  2. Stdin fileno 无论如何都是一个微型文件。为什么进程之间会有所不同?

【问题讨论】:

  • “可能有一组进程在前台运行”。能给我举个例子吗?我认为这是不可能的。
  • 不知道在Linux中是不是也是这样,但是在Windows中每个进程都可以打开一个单独的终端/控制台窗口。
  • 控制终端是什么意思?
  • @Charles Duffy 这就是我的观点。控制台与该进程相关联。
  • 这些术语都在Posix standard Base Definitions 中定义。 General Terminal Interface 的描述中还有很多有用的信息。

标签: c linux shell jobs


【解决方案1】:

最近我一直在尝试在 c 中实现一个作业控制 shell,我 得到了上述问题gnu文件给出了一个展示它 测试 stdin_fileno 是否为 tty。

我想你的意思是the section of the Glibc manual describing the implementation of a job-control shell。如果没有,那么这绝对是您应该阅读的内容。

这是我的问题:这样做 意味着当一个进程在前台运行时,它也是 控制终端?

没有。虽然每个终端都有一个控制进程,但这与前台和后台关系不大。我们通常对进程的控制终端更感兴趣——即在某种意义上控制进程的终端,而不是相反的终端。前景和背景与后一个概念有关。

属于终端的前台进程组的进程可以从该终端读取和写入。其他进程无法成功执行此操作 - 如果尝试,它们将阻塞或暂停。

如果不是,有什么区别?我意识到 可能有一组进程作为作业在前台运行, 那么在这种情况下,究竟是哪个进程控制着终端呢?

给定终端的前台进程组中的所有进程都可以从终端读取和写入。它们不需要成为终端的控制过程来执行此操作,而且通常不是。但他们通常将终端作为他们的控制终端。

关于问题更新:

当我键入命令时,它会在前台同时执行 时间我无法对终端做任何事情,直到它完成,在其他 换句话说,它控制着终端。

描述作为控制终端的进程是令人担忧的,特别是从实现shell的角度来看,因为它是前台vs的表现。背景,而不是终端的“控制过程”。前台进程组中的进程(通常)不控制终端,而是对它有特殊的访问权。作业控制外壳的部分工作是调解该访问。

【讨论】:

  • "3.114 控制进程 与控制终端建立连接的会话领导者。如果终端随后不再是此会话的控制终端,则会话领导者停止成为控制过程。” (pubs.opengroup.org/onlinepubs/9699919799/basedefs/…)。控制进程是终端断开时接收SIGHUP的进程。
  • 谢谢,@rici,我已经改写了这个答案,以便在这方面更清楚。
猜你喜欢
  • 2012-07-31
  • 1970-01-01
  • 2012-01-07
  • 2013-09-14
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
相关资源
最近更新 更多