什么是0、1和2以外的文件描述符

我试图了解sysdig的日志它提到的文件描述符不是0(标准输入),1(标准输出),2(标准错误);列出了文件描述符,例如3、6、7,-2。

如果这些是内存中的文件索引或文件编号,为什么会有负数?

事件的结构如下:

*%evt.num %evt.time %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.args

58650327 12:56:29.887941337 0 clear_console (5527) > open 
58650328 12:56:29.887948371 0 clear_console (5527) < open fd=-2(ENOENT) name=/dev/tty0 flags=3(O_RDWR) mode=0 
58650329 12:56:29.887949853 0 clear_console (5527) > open 
58650330 12:56:29.887954188 0 clear_console (5527) < open fd=-13(EACCES) name=/dev/console flags=3(O_RDWR) mode=0 
58650331 12:56:29.887954835 0 clear_console (5527) > open 
58650332 12:56:29.887956940 0 clear_console (5527) < open fd=-13(EACCES) name=/dev/console flags=1(O_RDONLY) mode=0 
58650333 12:56:29.887957474 0 clear_console (5527) > open 
58650334 12:56:29.887959911 0 clear_console (5527) < open fd=-13(EACCES) name=/dev/console flags=2(O_WRONLY) mode=0 
58650363 12:56:29.888201994 0 bash (5506) > open 
58650390 12:56:29.912662138 0 bash (5506) < open fd=-2(ENOENT) name=/etc/bash.bash_logout flags=1(O_RDONLY) mode=0 
58650395 12:56:29.912720036 0 bash (5506) > open 
58650396 12:56:29.912735157 0 bash (5506) < open fd=3(<f>/home/ubuntu/.bash_history) name=/home/ubuntu/.bash_history flags=10(O_APPEND|O_WRONLY) mode=0 
58650426 12:56:29.953271487 0 bash (5506) > open 
58650427 12:56:29.953303756 0 bash (5506) < open fd=3(<f>/home/ubuntu/.bash_history) name=/home/ubuntu/.bash_history flags=1(O_RDONLY) mode=0 
58650541 12:56:29.962503103 0 sshd (5495) > open 
58650542 12:56:29.962537862 0 sshd (5495) < open fd=6(<f>/etc/passwd) name=/etc/passwd flags=4097(O_RDONLY|O_CLOEXEC) mode=0 
58650559 12:56:29.962636515 0 sshd (5495) > open 
58650560 12:56:29.962646634 0 sshd (5495) < open fd=6(<f>/var/run/utmp) name=/var/run/utmp flags=4097(O_RDONLY|O_CLOEXEC) mode=0 
58651059 12:56:29.997560921 0 sshd (5495) > open 
58651060 12:56:29.997629170 0 sshd (5495) < open fd=7(<f>/var/run/utmp) name=/var/run/utmp flags=4099(O_RDWR|O_CLOEXEC) mode=0 
58651091 12:56:29.997727995 0 sshd (5495) > open 
58651092 12:56:29.997768935 0 sshd (5495) < open fd=6(<f>/var/log/wtmp) name=/var/log/wtmp flags=2(O_WRONLY) mode=0 
58651991 12:56:30.016524060 0 sshd (5495) > open 
58651992 12:56:30.016573912 0 sshd (5495) < open fd=4(<f>/etc/login.defs) name=/etc/login.defs flags=1(O_RDONLY) mode=0 
58652240 12:56:30.053254470 0 sshd (5495) > open 
58652241 12:56:30.053280905 0 sshd (5495) < open fd=4(<f>/etc/passwd) name=/etc/passwd flags=4097(O_RDONLY|O_CLOEXEC) mode=0
库萨兰达

当您open()用来打开文件时(请参阅参考资料man 2 open),您会得到一个文件描述符(int在C语言中为)。标准流与描述符0、1和2关联,并且任何其他打开的文件流将具有与之关联的单独的描述符。

一次可以打开多少个文件是有限制的,通常大约在512或1024左右(请参阅ulimit -Hn硬上限),并且每个打开的文件都将具有与之关联的文件描述符。

从概念上讲,它只是内核维护的数组索引。除了三个标准的文件描述符之外,文件描述符和任何其他流之间都没有固定的关联。


在添加到问题的日志中,您看到“负文件描述符”与错误代码(ENOENTEACCESS相关联open()系统调用的错误返回负数。

有关man errno这些错误代码的说明,请参见

文件描述符是每个进程的,因此进程A中的文件描述符6与进程B中的文件描述符6是不同的流。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章