为什么文件描述符中省略了20?

3

编辑:

lsof 显示该文件被 ptmx 打开。感谢 @zwol。


我的代码在打开文件后输出了文件描述符。我注意到数字 20 消失了。据我所知,没有类似的问题。

背景:

  • 文件系统: ext4
  • Ubuntu 20.04 在 WSL2 上

代码:

int main()
{
    char name[2] = "a";
    for (int i = 0; i < 52; i++) {
        int fd = open(name, O_RDWR | O_CREAT, 0644);
        printf("fd is %d\n", fd);
    }
    return 0;
}

输出:

$ ./a.out 
fd is 3
fd is 4
fd is 5
...
fd is 18
fd is 19
fd is 21 <-- here
fd is 22
...

lsof

...
a.out   1815 ryan   19u   REG   8,16        0 42321 /tmp/tmp/a
a.out   1815 ryan   20u   CHR    5,2      0t0 15832 /dev/ptmx
a.out   1815 ryan   21u   REG   8,16        0 42321 /tmp/tmp/a
...

我有两个问题:

  1. 此现象的原因是什么?(是什么引发了 ptmx
  2. 如果我继续打开文件,是否会缺少更多索引?(是否会有更多类似 ptmx 的程序?)
1个回答

1
POSIX规定,每个分配文件描述符的系统调用必须使用尚未使用的最低编号。因此,描述符号20必须已经打开。您的示例程序在循环之前没有打开任何内容,因此它必须是从您的shell继承的,或者在main函数之前由C库打开。
您可以通过让程序打印其PID,然后在循环之后睡眠很长时间,并在其睡眠时运行lsof来了解更多信息。

原来是由/dev/ptmx打开的字符特殊文件,你有什么参考资料可以找出触发它的原因吗? - Ryan Chen
1
/dev/ptmx是你终端窗口的伪终端外部接口。通常情况下,终端内运行的程序(如你的shell和该程序)无法访问它。我建议你联系你所使用的终端窗口软件的作者并请求解释。 - zwol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接