我的桌面上有几个用于各种程序的启动器,并且这些启动器有一个“在终端中运行”设置。
当我检查该设置时,程序从终端运行,并在那里记录其输出。我想它stdin
也可以从终端读取。
然而:当程序不是由终端运行时,IO 会发生什么?另外,当我从这样的程序执行系统(shell)命令时会发生什么?
是否有一个运行这些程序的“后台”shell?或者每个程序都有自己的外壳,通过它与系统的其余部分进行交互吗?
答案1
当一个程序启动时(通过系统调用系列之一),它会从父级exec(3)
继承环境(即 shell 变量ed)和打开的文件。export
启动程序时所做的事情是fork(2)
,子程序设置环境和文件,然后exec(3)
创建新程序。当 shell 执行此操作时,STDIN、STDOUT 和 STDERR 将连接到终端。任何图形启动器的作用取决于它,但应该将它们连接到/dev/null
(键盘输入应该来自哪里,输出应该去往哪里?)。
如果像这样启动的程序依次调用exec(3)
,则如上所述。system(3)
有点复杂,因为它会生成一个 shell 来执行命令行解析等,然后该 shellexec(3)
执行命令。但机制是相同的:文件是继承的,环境也是如此。