C++ 如何在UNIX-C++;?
我正在尝试获取相应的C++ 如何在UNIX-C++;?,c++,unix,path,device,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 (Cm
/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);
}
const字符串路径str(Path);//路径是输入值
//获取/dev/*文件
字符串Cmd(“df2>/dev/null | grep/dev | awk'{print$1,$6}'”;
FILE*Pipe=popen(Cmd.c_str(),“r”);
如果(!管道)
{
错误日志(“无法执行命令:\”“+Cmd+”);
返回字符串();
}
char Buf[BufSz];
stringstream sstr;
而(!feof(管道))
{
if(fgets(Buf、BufSz、管道))
sstr>开发>>安装点;
if(string::npos!=PathStr.find(MountPoint)&&
MountPoint.size()>diskpath.second.size())
DiskPaths=配对(开发、安装点);
}
调用system()
并解析输出可能是执行您试图执行的操作的更可靠、更方便的方法,因为df
命令可能使用各种依赖于系统的技巧将设备编号解析为/dev
中的名称,否则您必须自己实现
您可以轻松获得文件所在文件系统的设备号:它是stat()
结构的st\u dev
字段。但是如何在/dev
中找到与该数字匹配的文件,留给df
命令练习。特别要记住,并非每个文件系统都是从/dev
中的一个文件装载的:想想NFS,以及像/proc
这样的特殊文件系统
以下是您可以做的其他一些事情:
- 扫描
中的每个文件,查找其/dev
为相同编号的块设备st_rdev
- 分析已装入文件系统的表(
或/etc/mtab
,它取决于系统),查找可能是您感兴趣的路径名的父级的装入前缀/etc/mnttab
stat()
技巧似乎可以做到这一点,但继续使用df
要简单得多。因此,df
也读取/etc/mtab
文件,但我想这比我自己做要可靠得多。