如何在UNIX中将路径映射到相应的/ dev文件 - C ++?

时间:2012-06-06 08:44:12

标签: c++ unix path device

我正在尝试获取给定路径名的相应/dev文件,有点像df命令

我目前使用此命令,但我不想使用system()函数或特定于系统的命令。

这是当前的代码:

const string PathStr (Path); // Path is input value

// get the /dev/* files
string Cmd ("df 2> /dev/null | grep /dev | awk '{print $1, $6}'");

FILE * Pipe = popen (Cmd.c_str(), "r");
if (!Pipe)
{
    errorLog("Cannot execute command : \"" + Cmd + '"');
    return string();
}

char Buf [BufSz];
stringstream sstr;
while (!feof(Pipe))
{
    if (fgets(Buf, BufSz, Pipe))
        sstr << Buf;
}
pclose(Pipe);

// get the actual /dev file
pair<string, string> DiskPaths;
while (!sstr.eof())
{
    string Dev, MountPoint;
    sstr >> Dev >> MountPoint;
    if (string::npos != PathStr.find(MountPoint) &&
        MountPoint.size() > DiskPaths.second.size())
        DiskPaths = make_pair(Dev, MountPoint);
}

1 个答案:

答案 0 :(得分:1)

调用system()并解析输出可能是更可靠和可移植的方式来执行您要执行的操作,因为df命令可能会使用各种依赖于系统的技巧来解决设备编号为/dev中的名称,否则您必须自己实施。

您可以轻松获取文件所在文件系统的设备NUMBER:它是st_dev结构的stat()字段。但是如何找到/dev中的哪个文件与该号码一起使用仍然是df命令的练习。特别要记住,不是每个文件系统都是从/dev中的文件挂载的:想想NFS,以及像/proc这样的特殊文件系统。

以下是您可以做的其他事情:

  • 扫描/dev中的每个文件,查找st_rdev为相同数字的块设备
  • 解析已安装文件系统(/etc/mtab/etc/mnttab的表,它是系统相关的),寻找一个看起来可能是您感兴趣的路径名的父级的挂载前缀。< / LI>