了解控制终端

use*_*356 6 process terminal

我启动了一个 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
Run Code Online (Sandbox Code Playgroud)

1) 是否ttys000标识tw1ttys003标识tw2

2)第一行代表一个正在运行的java进程。它与ttys000. 所以基本上tw1是我的java进程的控制终端。这是正确的吗?

3)如果我运行ps -ef指令I看到一堆具有过程??tty柱。这是否意味着他们没有与该过程关联的打开的终端?

gro*_*mal 7

1.)

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

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

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

[userA@terminalA]$ tty
/dev/pts/0
Run Code Online (Sandbox Code Playgroud)

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

[userB@terminalB]$ tty
/dev/pts/3
Run Code Online (Sandbox Code Playgroud)

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

[userA@terminalA]$ echo Hi there > /dev/pts/3
Run Code Online (Sandbox Code Playgroud)

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

[userB@terminalB]$ Hi there
Run Code Online (Sandbox Code Playgroud)

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

2.)

或多或少。它ttys000本身只是字符设备,控制 Java 进程的实际实体是终端模拟器。通过控制,我的意思是它是您的 Java 进程的父进程。父进程可以以比其他进程更容易的方式与其子进程交互。

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

3)

Karlson回答已经解释了这?意味着一个与终端无关的进程。

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

结束语

/dev/tty现代 *nix 操作系统上几乎不使用实际的终端(尽管它们在启动过程中被大量使用)。但这并不意味着您不能使用实际的终端。在Linux机器(对不起,我不知道在Mac如何执行此)组合Ctrl+ Alt+ F1(和F2F3...高达F7)给你一个真正的终端。这些真实终端之一用于执行图形显示。

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

  • @user1745356 - UNIX 系统上的所有设备都是: 块设备,读/写字节块;和通过流读取/写入字节的字符设备(它们在字符总是一个字节长的时候命名)。如果你执行`ls -l`,字符设备将显示为`crwx------`,块设备显示为`brwx------`(类似于你在目录中看到的:`drwx-- ----`)。 (3认同)