我启动了一个 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标识tw1和ttys003标识tw2?
2)第一行代表一个正在运行的java进程。它与ttys000. 所以基本上tw1是我的java进程的控制终端。这是正确的吗?
3)如果我运行ps -ef指令I看到一堆具有过程??中tty柱。这是否意味着他们没有与该过程关联的打开的终端?
是的,虽然还有更多。 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*,我相信。
或多或少。它ttys000本身只是字符设备,控制 Java 进程的实际实体是终端模拟器。通过控制,我的意思是它是您的 Java 进程的父进程。父进程可以以比其他进程更容易的方式与其子进程交互。
此外,如果不采取某些预防措施(参见man nohup此类预防措施的示例),父进程的死亡将导致其所有子进程的死亡。
Karlson的回答已经解释了这?意味着一个与终端无关的进程。
由于终端本身只是字符设备,我相信不难得出结论,进程没有必要与终端设备相关联。
/dev/tty现代 *nix 操作系统上几乎不使用实际的终端(尽管它们在启动过程中被大量使用)。但这并不意味着您不能使用实际的终端。在Linux机器(对不起,我不知道在Mac如何执行此)组合Ctrl+ Alt+ F1(和F2,F3...高达F7)给你一个真正的终端。这些真实终端之一用于执行图形显示。
现代 *nix 操作系统上的多个进程(包括图形应用程序)与终端设备相关联,因为启动它们的脚本需要传递额外的参数。脚本触发 shell 传递额外的参数并启动进程。此类脚本通常会引起混淆。