【问题标题】:Understanding the Unix file descriptors理解 Unix 文件描述符
【发布时间】:2011-09-13 10:58:35
【问题描述】:

来自 Beej 的套接字编程书:

当 Unix 程序执行任何类型的 I/O 时,它们通过读取或 写入文件描述符。文件描述符只是一个整数 与打开的文件相关联。

它是否说程序读取和“写入”到“整数”?如果是,怎么可能?这意味着什么?

【问题讨论】:

    标签: sockets


    【解决方案1】:

    这意味着为了读取或写入文件,您需要执行系统调用,并且您的文件描述符(整数)是您用来告诉内核您正在谈论的文件的参数。它们是整数的事实相对无趣,它们可以是任何东西;您只能透明地使用它们,也就是说,您打开一个文件,存储描述符,然后将描述符传递回内核以对该文件进行任何操作。它的值只对内核感兴趣。一个值得注意的例外是特殊文件描述符 0、1 和 2(stdin、stdout 和 stderr),但即使是这些,您通常也使用预定义的常量而不是文字整数值。

    【讨论】:

    • 很好,是不是表示beej的定义有歧义?他们说程序会“在”那个整数上写。
    • @Anisha:关键在于“关联”这个词。整数代表文件,而不是文件。描述有点误导,但 IMO 不多。
    • 无论你在读什么,试着和作者一起思考......通常情况下,事情会在上下文中变得清晰。
    【解决方案2】:

    我也为文件描述符和 beejs 书苦苦挣扎。当我理解 c dup 函数的工作原理时,我顿悟了。

    PS:这是一个迟到的答案,但也许它可以帮助某人

    【讨论】:

      【解决方案3】:

      这是说文件描述符被实现为一个整数。也就是说,每个打开的文件都有一个唯一的引用方式,一个文件句柄实际上只是一个唯一的数字。

      当你这样做时:

      int fd = open("filename", flags);
      

      fd 是一个整数,由实现返回。它对于您在程序中打开并提供给您的文件是唯一的,以便稍后您可以引用同一个文件,例如对于read/write/close等。它只不过是一个用于关联一系列操作的令牌。

      【讨论】:

      • 看不懂file descriptors are implemented as an integer.请详细说明。
      • 这就是我已经知道的,但引用是说程序“在”那个整数上写?这是否意味着他们仅使用该整数引用他们必须写入的文件?
      • @Anisha - 引用说“读取或写入文件描述符”。文件描述符就是你从open 得到的。当您调用read(fd, ...) 时,您正在发出从特定文件描述符读取的请求。同样write(fd, ...) 是写入特定文件描述符的请求。
      • 好吧,write(fd, ...) is a request to write to a file descriptor 你不能写入整数吗?你可以吗?您可以使用该整数来“引用”您打算写入的某个文件吗?
      • @Anisha - 我不会说这是模棱两可的。这意味着文件描述符被用作对特定文件的 IO 操作抽象的一部分似乎很清楚。我认为这很可能被表述为(意外地)预先假定文件 IO 的知识。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多