“/proc/fd”文件描述符显示什么?

6

今天学习了关于/proc/目录的知识,特别是我对于所有有关进程信息都半公开可用的安全隐患很感兴趣,因此我编写了一个简单的程序来探索一些/proc/目录的属性。

#include <iostream>
#include <unistd.h>
#include <fcntl.h>

using namespace std;

extern char** environ;

void is_linux() {
#ifdef __linux
   cout << "this is running on linux" << endl;    
#endif
}

int main(int argc, char* argv[]) {
  is_linux();

  cout << "hello world" << endl;
  int fd = open("afile.txt", O_RDONLY | O_CREAT, 0600);
  cout << "afile.txt open on: " << fd << endl;

  cout << "current pid: " << getpid() << endl;;

  cout << "launch arguments: " << endl;
  for (int index = 0; index != argc; ++index) {
    cout << argv[index] << endl;
  }

  cout << "program environment: " << endl;
  for (char** entry = environ; *entry; ++entry) {
    cout << *entry << endl;
  }

  pause();
}

有趣的是(对我来说),当我检查文件描述符文件夹(/pid/<PID#>/fd)时,我看到了这个:

root@excalibur-VirtualBox:/proc/1546/fd# ls -l
total 0
lrwx------ 1 root root 64 Nov  7 09:12 0 -> /dev/null
lrwx------ 1 root root 64 Nov  7 09:12 1 -> /dev/null
lrwx------ 1 root root 64 Nov  7 09:12 2 -> /dev/null
lrwx------ 1 root root 64 Nov  7 09:12 3 -> socket:[11050]

为什么文件描述符指向/dev/null?这是为了防止用户在不实际成为进程本身的情况下向文件中注入内容吗?还是我对此一无所知?更加好奇的是,为什么打开文件的文件描述符要指向套接字?这看起来非常奇怪。如果有人能为我解答一下,我会非常感激。谢谢!

1
因为程序运行类似于 my_program < /dev/null > /dev/null 2>&1... 而且在Linux/Unix中,套接字被抽象为文件描述符,并且该程序打开了一个套接字以与某些东西通信... 此外,我不认为上面的C代码是在PID 1546的进程中运行的。 - twalberg
它在结尾处有pause(),并且显示了getpid()。为什么不是同一个程序呢?另外,我只是将其作为./program.out 1 2 3 fourth运行。 - sircodesalot
因为在所示代码中,您正在打开一个文件,而不是一个套接字...除非"afile.txt"实际上是一个命名套接字,而不是一个真正的文件。确保您没有错误地阅读/输入输出的PID,并且在程序仍在运行时查看同一系统上的/proc/<pid>(即您不是在虚拟机中查看/proc/<pid>,而是在运行VM的主机上运行程序或其他类似情况)。 - twalberg
啊,我可能重启了程序,忘记改变目录了。我会再检查一下的,谢谢! - sircodesalot
1个回答

8
您正在查看错误的/proc目录(可能是其他进程ID或另一台计算机上的)。您的程序在/proc/<pid>/fd中应该显示以下内容:
lrwx------ 1 user group 64 Nov  7 22:15 0 -> /dev/pts/4
lrwx------ 1 user group 64 Nov  7 22:15 1 -> /dev/pts/4
lrwx------ 1 user group 64 Nov  7 22:15 2 -> /dev/pts/4
lr-x------ 1 user group 64 Nov  7 22:15 3 -> /tmp/afile.txt

在这里,我们可以看到文件描述符0、1和2被显示为符号链接,指向程序正在运行的伪终端。如果你使用输入、输出和错误重定向启动程序,它可能是/dev/null。而文件描述符#3则指向当前打开的文件afile.txt


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