0

我正在尝试获取/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);
}
4

1 回答 1

1

调用system()和解析输出可能是更可靠和更便携的方式来执行您正在尝试执行的操作,因为该df命令可能会使用各种与系统相关的技巧来将设备编号解析为/dev您必须自己实现的名称否则。

您可以轻松获取文件所在文件系统的设备编号:它是结构的st_dev字段stat()。但是如何找到/dev与该数字对应的文件留作该df命令的练习。/dev特别要记住,并非每个文件系统都是从/proc.

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

  • 扫描每个文件以查找相同编号/dev的块设备st_rdev
  • 解析挂载文件系统的表(/etc/mtab或者/etc/mnttab,它是系统相关的)寻找一个挂载前缀,看起来它可能是您感兴趣的路径名的父级。
于 2012-06-06T14:17:21.167 回答