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:think NFSのファイル、およびのような特別なファイルシステムからマウントされるわけではないことに注意して/procください。

他にできることは次のとおりです。

  • すべてのファイルをスキャンして、同じ番号/devのブロックデバイスを探しますst_rdev
  • マウントされたファイルシステム(/etc/mtabまたは/etc/mnttab、システムに依存)のテーブルを解析して、目的のパス名の親である可能性があるマウントプレフィックスを探します。
于 2012-06-06T14:17:21.167 に答える