对于额外的背景,我问这早些时候提出问题,并以为我理解了事情,但现在不再了。
我知道echo
忽略stdin
。我知道stdin
、stderr
和stdout
存在,并且在这种情况下,我不知道除这些之外的“事物”存在。
那么,如果echo
ignores stdin
,它从哪里获取输入?看来stdin
,stdout
并stderr
没有说明全部故事。
答案1
我不确定我是否理解您困惑的根源,但请记住在Unix中命令行参数( thefoo
和bar
from echo foo bar
)和环境字符串( the FOO=bar
from env - FOO=bar printenv
)很简单复制的由内核在进程的地址空间中访问,就像任何其他内存一样(通过指针等)访问它们;它们不会像标准 stdin、stdout、stderr 或任何额外的文件描述符那样作为可由进程读取、写入或内存映射的文件传递。
这不是什么自然法则,这只是 Unix 中的运作方式。可以说这是过时的、不一致的和低效的(为每个进程创建整个环境的副本,即使它忽略了全部或大部分)。
可以做出不同的安排——计划9,环境字符串实际上是文件/env
(这也意味着它们可以在进程之间共享)。
此外,LD_PRELOAD
在 Linux 中可以使用 hack 来绕过 argv+env 限制,通过使用memfd_create
.