一个程序可以在没有 shell 作为中间的情况下执行另一个程序吗?

一个程序可以在没有 shell 作为中间的情况下执行另一个程序吗?

这可能是一个愚蠢的问题。为 Linux 编写的程序(例如用 Golang 编写)是否可以调用系统调用来直接执行另一个程序,还是必须先调用 shell 并让它运行另一个程序?我的意思并不是要替换当前的程序。假设我有program1一个网络服务器并且不断运行,它可以program2通过直接访问内核并使用相关的系统调用来执行,还是首先通过 shell 执行?如果不使用 shell,是否存在必须在程序中使用 shell 来执行某些操作的特定情况?如果是的话那会是什么?将不胜感激任何信息。

答案1

我可以在不使用 shell 作为中介的情况下运行程序吗?

是的:与启动 shell 的方式完全相同。

使用exec: 但这会替换当前进程。

使用fork: 创建一个新进程,然后exec替换它。 shell 使用其他有用的系统调用。pipe: 制作管道。dup:将管道连接到stdinstdout

通常有更高级别的库可以做到这一点。这些允许您的代码在其他操作系统(例如 Microsoft 的 Windows)上运行。他们将组合几个这样的系统调用(例如合成一个create_process调用)。

分叉一个进程然后替换它似乎会很慢。它不是。它比在 MS-Windows 上创建线程更快。fork非常高效:它推迟了大部分工作,因此通常不需要这样做。

当从另一个程序运行程序时,是否有任何时候我必须使用 shell?

仅当它是 shell 脚本时。但是,您可能希望使用它的服务:globing、重定向等。我认为 golang 有足够好的库来做到这一点,所以您不应该需要 shell。

相关内容