Armadilloフォーラム

アプリケーション上でのmountの方法

momura

2017年11月21日 13時40分

初めて投稿します。 大村と申します。よろしくお願いします。
SDカードやUSBメモリに読み書きするアプリケーションを作りたいのですが、
アプリケーション上でのmountの方法をご教示ください。
コマンドラインでのマウントは何度もやっており、「mount -t vfat /mmcblk0p1 /mnt」
のようなことをアプリケーション上で行ないたいです。
システムコールでmount()関数があるのは判りましたが、使い方がよく判りません。
特に引数の渡し方が判りません。
その他の関数で実現できるなら、何でも結構です。
また、SDカードやUSBメモリの挿抜の状態も上記関数で可能でしょうか?
その点も併せてご教示戴けると幸いです。
何とぞよろしくお願い申し上げます。

コメント

at_syunya.ohshio

2017年11月21日 14時59分

大塩です。

mount()関数の「manページ」はご確認済みでしょうか。

「manページ」とはlinux上でコマンドのドキュメントを確認できるコンテンツで
[man]コマンドを用いて使用します。

ATDE上で[man 2 mount]と実行すると
mount()関数のドキュメントを開くことができます。
このドキュメントに書式,使用方法が記載されているため
こちらを参考に実装すると良いかと思います。

SDやUSB挿抜検知については
「mount()関数実行時にグローバル変数[errno]を確認し、
 [ENOENT]が格納されていた場合は挿入されていない」
等の処理が可能です。

以上です。

momura

2017年11月21日 17時15分

大塩様

ご回答ありがとうございます。大村です。
man 2 mount 拝見しました。
これにより、いろいろやってみたのですが、返り値が成功で返ってきません。
例えば、次のように指定しています。
ret = mount("/dev/mmcblk0p1", "/mnt", "msdos", MS_BIND, NULL );

第4引数の部分はよく分からないので、MS_BIND以外にいろいろ変えて試しました。
いずれも-1が返ってきます。
何か使い方が間違っておりますでしょうか?
ご指導戴けたら幸いです。
何卒よろしくお願い申し上げます。

以上

> 大塩です。
>
> mount()関数の「manページ」はご確認済みでしょうか。
>
> 「manページ」とはlinux上でコマンドのドキュメントを確認できるコンテンツで
> [man]コマンドを用いて使用します。
>
> ATDE上で[man 2 mount]と実行すると
> mount()関数のドキュメントを開くことができます。
> このドキュメントに書式,使用方法が記載されているため
> こちらを参考に実装すると良いかと思います。
>
> SDやUSB挿抜検知については
> 「mount()関数実行時にグローバル変数[errno]を確認し、
>  [ENOENT]が格納されていた場合は挿入されていない」
> 等の処理が可能です。
>
> 以上です。

shkoga

2017年11月21日 17時32分

こんにちは。サムシングプレシャスの古賀です。

momuraさん:
>ご回答ありがとうございます。大村です。
>man 2 mount 拝見しました。
>これにより、いろいろやってみたのですが、返り値が成功で返ってきません。
>例えば、次のように指定しています。
> ret = mount("/dev/mmcblk0p1", "/mnt", "msdos", MS_BIND, NULL );
>
>第4引数の部分はよく分からないので、MS_BIND以外にいろいろ変えて試しました。
>いずれも-1が返ってきます。
>何か使い方が間違っておりますでしょうか?
>ご指導戴けたら幸いです。
>何卒よろしくお願い申し上げます。

直接の回答ではないのですが、「コマンドラインでのマウントは何度もやっており」とのことですから、
system() を使う、というのは、いかがでしょうか?
 https://linuxjm.osdn.jp/html/LDP_man-pages/man3/system.3.html
 http://sunnydays-k.hatenablog.com/entry/2015/05/15/230448

以上、もし参考になりましたら幸いです。

izawa

2017年11月21日 17時54分

毎度お世話様。

システムコールを使うのが無難でしょうけれど、コマンドでお馴染みなので
あれば安直にsystem()を使うのもLinux使いとしては一つの方策かと。
最も単純には、system("mount -t vfat /mmcblk0p1 /mnt");だけですね。
出力を解析したいならpopen(cmd, "r")の要領でfgets()で取得するとか。
或いは終了ステータスはsystem()の戻り値で得られますし、mountを
呼ぶシェルスクリプトを作ってそちらで終了ステータスを見る手も。

at_syunya.ohshio

2017年11月21日 18時03分

大塩です。

> ret = mount("/dev/mmcblk0p1", "/mnt", "msdos", MS_BIND, NULL );
上記文ですと、第4引数の[MS_BIND]が原因でエラーを起こしています。
[MS_BIND]は要約すると
「第一引数で指定したディレクトリの内容が第二引数で指定したディレクトリ内で操作可能にする」
というものです。

今回いただいた例ですと第一引数はデバイスですが、ディレクトリでないためエラーとなっています。
グローバル関数の[errno]を確認すると[ENOTDIR]が格納されているかと思われます。

第4引数で指定なしの場合は、[0]を引数に使用すると良いです。

以上です。

momura

2017年11月21日 18時32分

皆様ありがとうございます。 大村です。

なるほど、system()関数を使ったら、マウントできました。
これでいけそうです。
ただ、mount()関数の方は、第4関数を0としても、NULLとしても返値は同じ-1でした。
何か難しそうなので、system()関数を使って進めることにしたいと思います。
大塩様、すみませんでした。
それにしても、皆さんすばらしいですね。ご親切感謝致します。
助かりました。今後またよろしくお願い申し上げます。

以上

> 大塩です。
>
> > ret = mount("/dev/mmcblk0p1", "/mnt", "msdos", MS_BIND, NULL );
> 上記文ですと、第4引数の[MS_BIND]が原因でエラーを起こしています。
> [MS_BIND]は要約すると
> 「第一引数で指定したディレクトリの内容が第二引数で指定したディレクトリ内で操作可能にする」
> というものです。
>
> 今回いただいた例ですと第一引数はデバイスですが、ディレクトリでないためエラーとなっています。
> グローバル関数の[errno]を確認すると[ENOTDIR]が格納されているかと思われます。
>
> 第4引数で指定なしの場合は、[0]を引数に使用すると良いです。
>
> 以上です。
>