为什么有些程序从终端调用时会返回,而其他程序只返回包含“&”

为什么有些程序从终端调用时会返回,而其他程序只返回包含“&”

像 Skype 和 Tixati 这样的程序可以直接从终端调用,而无需&在调用结束时添加。为什么 Firefox 不是这样呢?我只是好奇我需要为哪些程序添加该&选项。

答案1

这完全取决于软件的编写方式,通常还取决于软件的意图。

大多数 bash(= shell、终端)实用程序旨在“同步”使用,这些实用程序的执行是为了产生结果;这可能是脚本或手动过程中以下命令所必需的 - 如果实用程序(程序、软件)分离并立即让您停留在提示符下,您将不知道何时或是否可以使用结果。

Skype 通常不用作命令行“实用程序”,而是一个处理通信(电话或其他)的工具。如果从那里启动,它不会阻止终端,那么它就非常方便。

从终端分离:
https://superuser.com/questions/178587/how-do-i-detach-a-process-from-terminal-entirely

答案2

所有程序都可以在不启用 的情况下调用&&完全是可选的。 它所做的只是将进程发送到后台,以便您可以继续使用终端。

如果没有它,如果您从终端启动一个进程,则需要等到该进程完成(或关闭)后才能继续使用终端。因此,人们经常运行程序以将command &它们发送到后台并继续在同一终端中工作。

有关各种 shell 操作符的更多信息&以及它们的作用,请参阅这里

答案3

程序将自身置于后台非常简单。执行此操作的代码可能非常简单,如下所示:

if (fork() > 0) _exit(0);

但默认情况下这样做会带来一些缺点。例如,您不能再将程序包装在脚本中,该脚本会在程序终止时执行某些操作。从后台进程向终端写入输出最终可能会看起来很混乱,后台进程的终端输出可以被禁用,但一旦后台进程尝试生成输出,它就会被冻结。

根据我的经验,Skype 和 Firefox 不会将自己置于后台。但它们会做一些不同的事情。

当你启动其中一个程序时,它们会检查是否已经有该程序的运行实例。如果已经有一个正在运行的实例,新实例将使用你刚刚提供的参数向正在运行的实例发送一条消息,然后退出。

这样做的效果是,已经运行的实例会执行某些操作,然后您会得到提示。

相关内容