Redirect Asked: 2019-05-03 14:59:31 +0800 CST2019-05-03 14:59:31 +0800 CST 2019-05-03 14:59:31 +0800 CST 了解文件流和文件描述符 772 对于额外的上下文,我之前问过这个问题,并认为我理解了一些事情,但现在不明白了。 我知道echo忽略stdin. 我知道stdin,stderr并且stdout存在,并且在这种情况下,我不知道除了这些之外的“事物”存在。 那么,如果echoignores stdin,它从哪里获得输入呢?似乎stdin,stdout并stderr没有讲述整个故事。 io stdout 1 个回答 Voted Best Answer mosvy 2019-05-03T16:38:57+08:002019-05-03T16:38:57+08:00 我不确定我理解你的困惑的根源,但请记住,在 Unix中,命令行参数(foo和barfrom echo foo bar)和环境字符串(FOO=barfrom env - FOO=bar printenv)只是由内核在进程的地址空间中复制,它们像任何其他内存一样被简单地访问(通过指针等);它们不会像标准的标准输入、标准输出、标准错误或任何额外的文件描述符那样作为可以被进程读取、写入或内存映射的文件传递。 这不是某种自然法则,它只是它在 Unix 中的工作方式。可以说这是过时的、不一致的和低效的(为每个进程制作了整个环境的副本,即使它忽略了所有或大部分)。 可以进行不同的安排——在plan9中,环境字符串实际上是其中的文件/env(这也意味着它们可以在进程之间共享)。 此外,LD_PRELOAD可以在 Linux 中使用 hack 绕过 argv+env 限制,方法是通过使用memfd_create.
我不确定我理解你的困惑的根源,但请记住,在 Unix中,命令行参数(
foo
和bar
fromecho foo bar
)和环境字符串(FOO=bar
fromenv - FOO=bar printenv
)只是由内核在进程的地址空间中复制,它们像任何其他内存一样被简单地访问(通过指针等);它们不会像标准的标准输入、标准输出、标准错误或任何额外的文件描述符那样作为可以被进程读取、写入或内存映射的文件传递。这不是某种自然法则,它只是它在 Unix 中的工作方式。可以说这是过时的、不一致的和低效的(为每个进程制作了整个环境的副本,即使它忽略了所有或大部分)。
可以进行不同的安排——在plan9中,环境字符串实际上是其中的文件
/env
(这也意味着它们可以在进程之间共享)。此外,
LD_PRELOAD
可以在 Linux 中使用 hack 绕过 argv+env 限制,方法是通过使用memfd_create
.