Next: , Previous: , Up: ファイル   [Contents][Index]


26.5 ファイルのロック

2人のユーザーが同時に同じファイルを編集する際には、彼らはおそらく互いに干渉しあうでしょう。Emacsはファイルが変更される際にファイルロック(file lock)を記録することにより、このような状況の発生を防ぎます。そしてEmacsは他のEmacsジョブにロックされているファイルをvisitしているバッファーへの変更の最初の試みを検知して、ユーザーに何を行うべきかを尋ねます。このファイルロックの実態は、編集中のファイルと同じディレクトリーに格納される特別な名前をもつシンボリックリンクです。この名前はバッファーのファイル名に.#を前置することにより構築されます。シンボリックリンクのターゲットはuser@host.pid:bootという形式になります。ここでuserはカレントのユーザー名( user-login-nameかより得)、hostはEmacsを実行中のホスト( system-nameより取得)、pidはEmacsのプロセスID、bootは最後のブートからの経過時間です。ブート時刻が利用できなければ:bootは省略されます。(シンボリックリンクをサポートしないファイルシステムでは、user@host.pid:bootという形式を構築するか割りに通常のファイルが使用される)。

ファイルのアクセスにNFSを使用する際には、可能性は小さいものの他のユーザーと同じファイルを同時にロックするかもしれません。これが発生すると2人のユーザーが同時にファイルを変更することが可能になりますが、それでもEmacsは2番目に保存するユーザーにたいして警告を発するでしょう。たファイルをvisitしているバッファーでディスク上でファイルの変更を検知することにより、ある種の同時編集を捕捉できます。バッファーの変更 Timeを参照してください。

Function: file-locked-p filename

この関数はファイルfilenameがロックされていなければnilをリターンする。このEmacsプロセスによりロックされていればt、他のEmacsジョブによりロックされている場合はロックしたユーザーの名前をリターンする。

(file-locked-p "foo")
     ⇒ nil
Function: lock-buffer &optional filename

この関数はカレントバッファーが変更されていればファイルfilenameをロックする。引数filenameのデフォルトはカレントバッファーがvisitしているファイル。カレントバッファーがファイルをvisitしていない、バッファーが変更されていない、またはcreate-lockfilesnilなら何もしない。

Function: unlock-buffer

この関数はカレントバッファーが変更されていればバッファーによりvisitされているファイルをアンロックする。バッファーが変更されていなければ、そのファイルをロックしてはならないのでこの関数は何もしない。カレントバッファーがファイルをvisitしていない、またはファイルがロックされていなければこの関数は何もしない。この関数はdisplay-warning呼び出しによってファイルシステムエラーを処理して、それ以外の場合にはエラーを無視する。

User Option: create-lockfiles

この変数がnilならEmacsはファイルをロックしない。

User Option: lock-file-name-transforms

デフォルトでは、Emacsはロックするファイルと同じディレクトリーにロックファイルを作成する。この変数をカスタマイズしてこれを変更できる。これはauto-save-file-name-transformsと同じ構文をもつ(自動保存を参照)。たとえばEmacsにすべてのロックファイルを/var/tmp/に書き込ませるには、以下のようにすればよい:

(setq lock-file-name-transforms
      '(("\\`/.*/\\([^/]+\\)\\'" "/var/tmp/\\1" t)))
Function: ask-user-about-lock file other-user

この関数はユーザーがfileの変更を試みたが、それが名前other-userのユーザーにロックされていたとき呼び出される。この関数のデフォルト定義は何を行うかユーザーに尋ねる関数。この関数がリターンする値はEmacsが次に何を行うかを決定する:

  • tはそのファイルのロックを奪うことを意味する。その場合にはother-userはロックを失い、そのユーザーがファイルを編集することができる。
  • nilはロックを無視して、とにかくユーザーがファイルを編集できるようにすることを意味する。
  • この関数はかわりにエラーfile-lockedをシグナルする。この場合には、ユーザーが行おうとしていた変更は行われない。

    このエラーにたいするエラーメッセージは以下のようになる:

    error→ File is locked: file other-user
    

    ここでfileはファイル名、other-userはそのファイルのロックを所有するユーザーの名前。

望むなら他の方法で判定を行う独自バージョンでask-user-about-lock関数を置き換えることができる。

User Option: remote-file-name-inhibit-locks

変数remote-file-name-inhibit-lockstをセットして、リモートロックファイルの作成を抑止できる。

Command: lock-file-mode

これはインタラクティブに呼び出されるコマンドであり、カレントバッファーでcreate-lockfilesのローカル値を切り替える。