当我用另一种编程语言运行命令行程序时,底层发生了什么?

当我用另一种编程语言运行命令行程序时,底层发生了什么?

某些编程语言有 system() exec() 调用,我可以在调用中运行命令。当我执行此操作时究竟会发生什么?如果我运行 system("ls"),它会在字符串上运行 bash 解释器吗?它会进行操作系统调用吗?当它是一个像 top 这样的程序时,它会修改终端屏幕而不是不断转储,会发生什么?

我不太清楚该如何提问。我在哪里可以了解更多有关其工作原理的信息?

答案1

这个页面描述得很好

http://pubs.opengroup.org/onlinepubs/009604499/functions/system.html

如果命令为空指针,则 system() 函数应确定主机环境是否具有命令处理器。如果命令不是空指针,则 system() 函数应将命令指向的字符串传递给该命令处理器,以实现定义的方式执行;这可能会导致调用 system() 的程序以不符合要求的方式运行或终止。

因此,它确实会调用 bash 解释器,前提是这是由该系统上的 C 标准库实现确定的命令处理器。会创建一个子进程,该子进程会在命令执行后被销毁。

编辑:这是 C 特有的,其他语言可能功能不同,但通常是这样的

答案2

这些函数调用的实现方式取决于您使用的语言。但是,一般来说,它们会派生一个运行 shell 的新进程,然后在其中运行您的命令。一旦进程完成,它就会终止,并且您的程序将收到语言定义的返回值(通常是返回代码或运行程序的标准输出)。

由于它分叉一个新的进程来运行命令,它的行为不会影响你自己程序的运行环境。

相关内容