Io
了解文件流和文件描述符
對於額外的上下文,我之前問過這個問題,並認為我理解了一些事情,但現在不明白了。
我知道
echo
忽略stdin
. 我知道stdin
,stderr
並且stdout
存在,並且在這種情況下,我不知道除了這些之外的“事物”存在。那麼,如果
echo
ignoresstdin
,它從哪裡獲得輸入呢?似乎stdin
,stdout
並stderr
沒有講述整個故事。
我不確定我理解你的困惑的根源,但請記住,在 Unix中,命令行參數(
foo
和bar
fromecho foo bar
)和環境字元串(FOO=bar
fromenv - FOO=bar printenv
)只是由核心在程序的地址空間中複製,它們像任何其他記憶體一樣被簡單地訪問(通過指針等);它們不會像標準的標準輸入、標準輸出、標準錯誤或任何額外的文件描述符那樣作為可以被程序讀取、寫入或記憶體映射的文件傳遞。這不是某種自然法則,它只是它在 Unix 中的工作方式。可以說這是過時的、不一致的和低效的(為每個程序製作了整個環境的副本,即使它忽略了所有或大部分)。
可以進行不同的安排——在plan9中,環境字元串實際上是其中的文件
/env
(這也意味著它們可以在程序之間共享)。此外,
LD_PRELOAD
可以在 Linux 中使用 hack 繞過 argv+env 限制,方法是通過使用memfd_create
.