3

私のアプリは、USBスロットに挿入されたペンドライブの内容をマウントして確認することになっています。問題は、一部のユーザーが標準の「vfat」以外のファイルシステム用にフォーマットされたペンドライブを使用している可能性があることです。標準

 mount /dev/sda1 /mnt/pendrive -t auto

私のニーズには十分でしょう-それは機能し、カーネルで読み取り可能なファイルシステムが使用されます。system()問題は、アプリケーション内から実行する必要があることです。「自然な」Cソリューションが存在する場合は、コマンドの呼び出しやシェルコマンドを避けたいと思います。

 #include <sys/mount.h>
 ...
 result = mount("/dev/sda1", "/mnt/pendrive", "vfat" ,0, NULL);

正しく動作します。しかし、私が交換"vfat"する"auto"か、NULL何もマウントされていない場合。

ビジーボックスのマウントのソースをチェックしたところ、「auto」またはファイルシステムタイプが指定されていない場合、mount()呼び出しでファイルシステムがNULLに設定されているようです。しかし、そのトリックは私にはうまくいかないようです。私は何が欠けていますか?これを行うための比較的簡単な方法はありますか?

4

3 に答える 3

5

カーネルはファイルシステムを自動検出できないため、自分で検出する必要があります。

busyboxが実際に行うことは、関連するすべてのファイルシステムをループし、/ proc / filesystemsから解析し、成功するまでmount()を呼び出すことです(1898行目を参照) 。

于 2012-07-09T15:43:17.913 に答える
3

ループを使用しないのはなぜですか?

#define MAX 4
const char *FSTypes[MAX] = { "ext4", "btrfs", "ntfs", "vfat" };
short Inc = 0;

for (; Inc < MAX; ++Inc)
{
    if (mount("/source", "/target", FSTypes[Inc], 0, NULL) == 0)
    { /*If it's successful, stop.*/
        break;
    }
}

古い質問だと思いますが、これは答えを探している他の人にも関係があるようです。

于 2013-09-02T16:46:12.110 に答える
1

それmount /dev/sda1 /mnt/pendrive -t autoがあなたがする必要があることなら。次に、それを実行します。

sprintf(cmd, "mount /dev/sda1 /mnt/pendrive -t auto")    
rc = system(cmd);

また

sprintf(cmd, "mount /dev/sda1 /mnt/pendrive -t auto")    
if ((p = popen(cmd, "w")) != NULL)
{
    ...
}

正常に動作するはずです。ノードパスを取得するには、udevイベントをリッスンするか、udevログをスキャンして現在接続されているUSB大容量ストレージデバイスを探す必要がある場合がありますが、それで開始できます。

于 2012-07-09T18:12:42.417 に答える