了解控制终端

了解控制终端

我启动了一个java程序,它只是从unix终端进入无限循环(假设终端窗口TW1)我打开了第二个终端窗口(比如说TW2)并执行的ps -ef | grep java命令给了我以下输出

501 32566 32444   0  2:26PM ttys000    7:43.89 /usr/bin/java com.test.Hello
501 32784 31676   0  2:34PM ttys003    0:00.00 grep java

1) 是否ttys000识别TW1ttys003确定TW2

2) 第一行代表正在运行的java进程。它与 相关联ttys000。所以基本上TW1是我的java进程的控制终端。这是对的吗?

3)如果我运行命令,我会看到列中ps -ef有一堆进程。这是否意味着他们没有与该进程关联的打开的终端???tty

答案1

1.)

是的,尽管还有更多内容。 ttys000也是一个位于 的字符设备/dev,具有写入tty组权限的用户(大多数用户都有)可以通过管道将字符输入该设备,并且它们将出现在相应的终端上。 ttys*虽然它们不是真正的电传打字机,但它们是tty由您的(适当命名的)终端模拟器模拟的。

我没有 Mac,因此我将在以下示例中使用 Linux 命名约定:

以用户A的身份打开终端A并找到模拟的tty:

[userA@terminalA]$ tty
/dev/pts/0

以用户 B 身份打开终端 B 并执行相同操作:

[userB@terminalB]$ tty
/dev/pts/3

现在将几个字符从终端 A 重定向到终端 B:

[userA@terminalA]$ echo Hi there > /dev/pts/3

并看到它们出现在终端 B 上:

[userB@terminalB]$ Hi there

我相信,在 Mac 上,这些设备应该是/dev/ttys*

2.)

或多或少。它ttys000本身只是字符设备,控制 java 进程的实际实体是终端模拟器。经过控制我的意思是它是你的java进程的父进程。父进程可以比其他进程更轻松地与其子进程进行交互。

此外,如果不采取某些预防措施(请参阅man nohup此类预防措施的示例),父进程的死亡将导致其所有子进程的死亡。

3)

卡尔森的回答已经解释过,这?意味着与终端无关的进程。

由于终端本身只是字符设备,相信不难得出,进程没有必要与终端设备关联起来。

结束语

实际的终端/dev/tty在现代 *nix 操作系统上几乎不使用(尽管它们在引导过程中被广泛使用)。但这并不意味着您不能使用实际的终端。在 Linux 机器上(抱歉,我不知道 Mac 是如何执行此操作的)组合Ctrl+ Alt+ F1(以及F2, F3, ... 直到F7)给你一个真实的终端。这些真实终端之一用于执行图形显示。

现代 *nix 操作系统上的多个进程(包括图形应用程序)与终端设备相关联,因为启动它们的脚本需要传递额外的参数。该脚本触发一个 shell,传递额外的参数并启动该进程。此类脚本常常会造成混乱。

相关内容