为什么有些程序立即返回外壳程序,而另一些程序直到执行完成才返回外壳程序?


13

我从《现代操作系统》一书中了解到,运行命令时,外壳程序会创建一个子进程,等待该子进程直到子进程完成执行,然后再等待用户的另一条命令。对于许多类似的程序,确实确实如此gedit。直到我关闭终端才会接受命令gedit。但是,当我打开原子代码编辑器时,即使运行编辑器,shell也会立即返回,准备接受下一条命令。关闭终端不会关闭原子。这是否意味着编辑器不是作为子进程打开的?什么使得这种可能性成为可能?

跑步ps au | grep atom

<username>      8042  0.0  0.0  15944  2264 pts/1    S+   00:55   0:00 grep --color=auto atom

1
启动atom Editor之后,您可以ps au | grep atom在终端中运行并将输出添加到您的问题吗?
kirill-a

@ kirill-a我已经更新了问题。
Aswin PJ

Answers:


18

该问题询问两种程序:

  1. 在外壳中与用户交互的程序,以及
  2. 在shell中与用户交互的程序。

在第一种情况下,在外壳中与用户交互的程序被设计为在将控制权还给外壳之前运行完成。没什么特别的。

第二种情况更为复杂。通常,该程序将派生(在内存中复制其自身),并安排删除其与外壳的控制终端的关联,并可能执行另一个程序-该程序独立于原始外壳运行。您可能会看到来自第二个程序的消息,但通常不会与您进行交互。根据使用方式,您可能有

  • 一个守护程序(服务器)处理,或
  • 该程序可能会在新窗口中运行。图形编辑器负责后者。

进一步阅读:


关于派生和与终端解除关联的部分通常是通过调用daemon执行所有这些操作的库函数来完成的。
kasperd '16

为了避免获得控制终端,请使用双叉
jfs

两种评论:该功能不在POSIX中,并且我知道控制终端,但是使答案简短而简单。自1980年代后期以来,我就一直使用双叉。
Thomas Dickey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.