2012-06-06 101 views
0

我试图让给出的路径名对应的/dev文件,有点像df命令如何在UNIX中将路径映射到相应的/ dev文件 - C++?

我目前使用这个命令,但我宁可不使用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

调用system()和解析输出很可能做你正在尝试做更可靠和可移植的方法,因为df命令可以使用各种系统 - 依赖技巧来将设备编号解析为/dev中的名称,否则您必须自行实施。

您可以轻松获取文件所在文件系统的设备NUMBER:它是stat()结构的st_dev字段。但是如何找到/dev中的哪个文件与该号码一起作为df命令的练习。特别是,请记住,并非每个文件系统都从/dev中的文件装载:请考虑NFS和特殊文件系统,如/proc

这里有一些其他的事情可以做:

  • 扫描在/dev每个文件找了块设备,其st_rdev相同数量的
  • 解析挂载文件系统(/etc/mtab/etc/mnttab的表,它的系统相关)寻找一个安装前缀,看起来像它可能是你感兴趣的路径名的父亲。
+0

对,'stat()'技巧似乎做的事情,但它的很多实现继续使用'df'。因此,'df'也读取'/ etc/mtab'文件,但我想它比我自己做的更可靠。 – perelo

相关问题