在运行 Ubuntu 19.10 的 x64 系统中,文件描述符的大小(以位为单位)是多少?

pro*_*200 3 c linux assembly x86-64 file-descriptor

文件描述符(例如标准输入和标准输出)的大小(以位为单位)是多少,它是 32 位整数吗?

Aco*_*orn 5

如果您正在谈论 Linux 系统调用返回(并用于)的实际文件描述符,请按照 @JonathanLeffler 的建议查看open等的联机帮助页。

\n\n

例如:

\n\n
\n
int open(const char *pathname, int flags);\n
Run Code Online (Sandbox Code Playgroud)\n\n

的返回值open()是一个文件描述符,一个小的非负整数,用于后续系统调用。[...] 成功调用返回的文件描述符将是当前未为进程打开的最小编号的文件描述符。

\n
\n\n

鉴于类 Unix 系统是 LP64,int因此文件描述符是 32 位宽。

\n\n

但是,请注意,内核将为您提供尽可能小的整数,并且由于内核全局限制或软/硬限制,您通常会在此之前达到限制(请参阅文件描述符数量的限制)。

\n\n

这意味着,如果您确实需要它,理论上您可以使用较小的整数来存储文件描述符,例如 anint16_t或 an int8_t(假设您的进程一次不会使用那么多文件描述符)。

\n\n
\n\n

相反,如果您指的是stdinetc,则这些不是文件描述符,而是 C 标准定义的文件流。

\n\n

它们是扩展为指针类型 ( FILE *) 的表达式的宏,并且典型 64 位平台(如 x86_64)中的指针是 64 位宽。

\n\n

参见 7.21p3(输入/输出<stdio.h>):

\n\n
\n
stdin\nstdout\nstderr\n
Run Code Online (Sandbox Code Playgroud)\n\n

它们是 \xe2\x80\x98\xe2\x80\x98 类型的表达式,指向FILE\xe2\x80\x99\xe2\x80\x99 ,分别指向FILE与标准错误、输入和输出流关联的对象。

\n
\n

  • 这些是文件流,而不是文件描述符。 (4认同)