SOFSの使いかたと仕組みと背景

ん。なんか飽きてきたな…(はやいよ)

これは何?

Cで書いた関数をシェルから呼べたらいいなーというお客様の声を実現しました。(どんなお客さんだろうか)
共有ライブラリに入ってる関数をファイルシステムを通じて呼べる仕組みとかそんな。

使いかた

sofs をコンパイルして実行するとよいです。
コンパイルには、tr1が使えるC++コンパイラ(多分GCCの4.0か4.1以降ぐらい)、boost-1.33ぐらい、FUSEの2.5ぐらいがいります。
実行するには、FUSEが使える環境が必要です。(FUSEが使える環境ってどんなんですかね?)


実行は↓

 $ sofs mount-point

これで、sofsがmount-pointで指定したディレクトリにマウントされるますよ。


最初は、

 $ ls test
controls  variables

このふたつのディレクトリがあるはず。(もし、違うなら、あなたが見てるものはなんか違うものだと思う)

 $ ls test/controls/
add_libdir  add_libfile
 $ ls test/variables/
 $ 

中身はこんなかんじ(variablesは空です)
準備はできました。shared objectを追加していきませう。add_libfileにファイル名を書きこむと、そのファイルに含まれてる関数が見えるようになります

~/test/sofs $ echo /usr/lib/libpng.so > test/controls/add_libfile
~/test/sofs $ ls test
controls    libpng.so png_access_version_number ....(省略)png_zfree variables

あとは、見えてる関数を実行すればよいです。

$ test/png_zalloc
test/png_zalloc: line 2: echo: write error: ソフトウェアが接続を中断しました

型チェックとかはしてないので、引数間違うとあっさり死にます。気を付けましょう。(型チェックは嫌いなあなたにおすすめ。)


戻り値は、variables/retvalに4byte(ワード単位)のデータとして入ってます。od とかでチェックするとよいです。

$ echo /lib/libc.so.6 > test/controls/add_libfile
$ test/abs -99
$ od -tu4 test/variables/retval
0000000         99
0000004
$ wc -c test/variables/retval
4 test/variables/retval

引数に渡す値は、','で区切ってください。
引数に渡せる式は、いまのところ、整数、文字列、変数です。気が向いたら増えるかもしれません。整数っぽいものは整数、文字列っぽいものは文字列、変数っぽいものは変数になります。

$ test/printf '"nanika:%d %d"' , 100, retval
$ 

標準出力はいまのところどっかへいきます。どこへ行くんでしょうね?

参考: 変数へ値を代入する方法

$ # retvalをaに代入
$ cp retval a
$ # .emacsの先頭4byteをaに代入
$ cp ~/.emacs a
cp: writing `a': 関数は実装されていません # 4byteよりうしろはどっかへいきます。

仕組み

明日へ続く。