我启动了一个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
识别TW1并ttys003
确定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,传递额外的参数并启动该进程。此类脚本常常会造成混乱。