了解文件流和文件描述符

了解文件流和文件描述符

对于额外的背景,我问早些时候提出问题,并以为我理解了事情,但现在不再了。

我知道echo忽略stdin。我知道stdinstderrstdout存在,并且在这种情况下,我不知道除这些之外的“事物”存在。

那么,如果echoignores stdin,它从哪里获取输入?看来stdinstdoutstderr没有说明全部故事。

答案1

我不确定我是否理解您困惑的根源,但请记住在Unix中命令行参数( thefoobarfrom echo foo bar)和环境字符串( the FOO=barfrom env - FOO=bar printenv)很简单复制的由内核在进程的地址空间中访问,就像任何其他内存一样(通过指针等)访问它们;它们不会像标准 stdin、stdout、stderr 或任何额外的文件描述符那样作为可由进程读取、写入或内存映射的文件传递。

这不是什么自然法则,这只是 Unix 中的运作方式。可以说这是过时的、不一致的和低效的(为每个进程创建整个环境的副本,即使它忽略了全部或大部分)。

可以做出不同的安排——计划9,环境字符串实际上是文件/env(这也意味着它们可以在进程之间共享)。

此外,LD_PRELOAD在 Linux 中可以使用 hack 来绕过 argv+env 限制,通过使用memfd_create.

相关内容