我正在尝试获取给定路径名的相应/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);
}
答案 0 :(得分:1)
调用system()
并解析输出可能是更可靠和可移植的方式来执行您要执行的操作,因为df
命令可能会使用各种依赖于系统的技巧来解决设备编号为/dev
中的名称,否则您必须自己实施。
您可以轻松获取文件所在文件系统的设备NUMBER:它是st_dev
结构的stat()
字段。但是如何找到/dev
中的哪个文件与该号码一起使用仍然是df
命令的练习。特别要记住,不是每个文件系统都是从/dev
中的文件挂载的:想想NFS,以及像/proc
这样的特殊文件系统。
以下是您可以做的其他事情:
/dev
中的每个文件,查找st_rdev
为相同数字的块设备/etc/mtab
或/etc/mnttab
的表,它是系统相关的),寻找一个看起来可能是您感兴趣的路径名的父级的挂载前缀。< / LI>