Io

了解文件流和文件描述符

  • May 3, 2019

對於額外的上下文,我之前問過這個問題,並認為我理解了一些事情,但現在不明白了。

我知道echo忽略stdin. 我知道stdinstderr並且stdout存在,並且在這種情況下,我不知道除了這些之外的“事物”存在。

那麼,如果echoignores stdin,它從哪裡獲得輸入呢?似乎stdinstdoutstderr沒有講述整個故事。

我不確定我理解你的困惑的根源,但請記住,在 Unix中,命令行參數(foobarfrom echo foo bar)和環境字元串(FOO=barfrom env - FOO=bar printenv)只是由核心在程序的地址空間中複製,它們像任何其他記憶體一樣被簡單地訪問(通過指針等);它們不會像標準的標準輸入、標準輸出、標準錯誤或任何額外的文件描述符那樣作為可以被程序讀取、寫入或記憶體映射的文件傳遞。

這不是某種自然法則,它只是它在 Unix 中的工作方式。可以說這是過時的、不一致的和低效的(為每個程序製作了整個環境的副本,即使它忽略了所有或大部分)。

可以進行不同的安排——在plan9中,環境字元串實際上是其中的文件/env(這也意味著它們可以在程序之間共享)。

此外,LD_PRELOAD可以在 Linux 中使用 hack 繞過 argv+env 限制,方法是通過使用memfd_create.

引用自:https://unix.stackexchange.com/questions/516867