当我在计算机上启动进程时,我看到打开了一个文件描述符 6,该描述符的用途/用途是什么?

当我在计算机上启动进程时,我看到打开了一个文件描述符 6,该描述符的用途/用途是什么?

今天,我注意到在启动时验证其文件描述符的工具中出现错误。事实是我得到了一个额外的pts连接:

# In one console I start `cat`
linux $ cat >/tmp/test

# In another console I search for `cat`'s process ID
linux $ ps -ef | grep cat
alexis   34462 25012  0 11:58 pts/17   00:00:00 cat

# Now check the file descriptors:
linux $ ls -l /proc/34462/fd
total 0
lrwx------ 1 alexis alexis 64 Sep 23 11:59 0 -> /dev/pts/17
l-wx------ 1 alexis alexis 64 Sep 23 11:59 1 -> /tmp/test
lrwx------ 1 alexis alexis 64 Sep 23 11:59 2 -> /dev/pts/17
lrwx------ 1 alexis alexis 64 Sep 23 11:59 6 -> /dev/pts/17

正如我们所看到的,stdin被设置为目标文件名/tmp/test。正如预期的那样,0 和 2 设置为 a pts

那么 6 是什么?

我想这可能来自我的 Rails 环境。该rvm脚本对我的控制台做了一些“魔法”,当我cd进入包含名为 的文件的目录时Gemfile,它会检测到它。话虽这么说,我认为这只是一个cd别名...还有什么可以将这样的文件描述符添加到我的命令行中吗?我可以做什么来测试它的来源以及它提供的功能?


更新:我可以确认,如果我在注释掉 RVM 初始化 ( . ~/.rvm/scripts/rvm .) 之后打开一个新控制台,那么我不会获得额外的伪终端文件描述符。我仍然想知道他们怎么能做到这一点?

答案1

RVM 启动时会向当前连接的任何标准错误打开一个新的文件描述符。因此,在 RVM 环境中,文件描述符 6 是 RVM 日志输出。这样,无论标准错误是否已重定向,RVM 都可以通过将输出写入文件描述符 6 来记录到同一位置。

文件描述符已打开在......的最后scripts/functions/logging

exec 6>&2

execbuiltin 不带参数,但带有重定向,在 shell 进程内执行重定向。因此,exec 6>&2将文件描述符 6 打开到 shell 中的任何文件描述符 2。从 shell 启动的程序继承此文件描述符。

当 RVM 想要记录某些内容时,它(通常)输出到文件描述符 6。这发生在功能rvm_error, 例如。

例如,以下代码在从终端启动的 RVM 环境中执行,它将“Stuff gone”写入myfile.log,但写入Hello终端。

f () {
  echo >&2 "Stuff happened"
  rvm_error "Hello"
}
f 2>myfile.log

答案2

该特殊文件包含当前线程 futex 上下文句柄。

相关内容