Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在UNIX-C++;?_C++_Unix_Path_Device - Fatal编程技术网

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
文件,但我想这比我自己做要可靠得多。