Euslispは、System5のshmemではなく、SunOSのmmapによって共有メモリを提供する。
共有メモリは、map-file関数によって配置される。
map-fileは、EusLispのプロセスメモリ空間内にファイルを配置し、
foreign-stringのインスタンスを返す。
データはこのforeign-stringに対する文字列関数を用いることにより
書き込みと読みだしができる。
共有メモリは、システム依存のページ境界に配置されるので、
配置アドレスを指定すべきではない。
:shareのキーパラメータがNILに設定されているかまたは
:privateがTに設定されているファイルを配置することは、
ファイルをプライベート(排他的)にアクセスすべきであることを意味する。
しかし、メモリの共有化の目的から外れるため、
:shareのデフォルト値はTである。
2人のユーザーでファイルが共有されるとき、読み書きの許可は
両方のユーザーに正確に設定されなければならない。
残念なことにSunOSは、ネットワークを通して異なったワークステーション間の
ファイルの共有ををサポートしていない。
64バイト長のファイルを2つのEusLispで共有するプログラム例を下に示す。
;; 64バイトのファイルを作る
(with-open-file (f "afile" :direction :output) (princ (make-string 64) f))
;; 配置する
(setq shared-string1 (map-file "afile" :direction :io))
;;
;; 他のプロセスの中で
(setq shared-string2 (map-file "afile" :direction :io))
その後、shared-string1に書かれたデータは
すぐにshared-string2へ現れる。
foreign stringへの書き込みは、
replaceかsetfにarefを組み合せることにより可能である。
map-file filename &key (:direction :input) :length (:offset 0) (:share t)
(:address 0) [関数]
-
-
filenameという名のファイルをメモリ空間に配置する。
filenameは、ローカルファイル、NFSでマウントされたリモートファイル、
または/devの中のメモリデバイスのどれでも可能である。
この関数の結果としてforeign-stringが返される。その要素は、arefによってアクセス可能である。map-fileによって:direction=:inputという条件で
配置されたforeign-stringにデータを書き込むことは、segmentation faultの原因となる。
2016-04-05