次のページ 前のページ 目次へ

10. ロックして他で使えないようにする

10.1 はじめに

自分がシリアルポートを使う時には、他の人は同時に使えないようにした いと思うでしょう。しかし、他の人にも使わせたいこともあるかもしれません。 例えば自分がテキスト端末を使っている時に、他の人が重要なメッセージを 送れるようにしたい場合です。

自分が現在使用中のシリアルポートを他の人(や他のプロセス)が使えないよう にする方法(ロッキング)は色々あります。この処理は自動的に行われるはずで すが、問題が起きた時のためにロッキングを知っておくことは重要です。 プログラムが異常終了したり、(コンセントを引き抜くなどで)PC が突然落ち たりした場合には、シリアルポートがロックしたままになってしまうかもしれ ません。ロックが残ったままであっても、普通は次にシリアルポートを使おう とした時に自動的にロックは消されます。しかしまれにそうでないこともあり ます。そんな時には何が起こったのかを理解する必要があります。

ロッキングを実装する方法の一つは、ロックを処理できるようにカーネルを設 計することですが、Linux はこれまではこの方法を避けてきました(今では使 われなくなった cua デバイスは例外です)。Linux で使われる方法は 2 つあ ります。

  1. ロックファイルを作る方法
  2. /dev/ttyS2 等のデバイスのパーミッションや所有者を変える方法

10.2 ロックファイル

ロックファイルは特定のデバイスが使用中であることを示すために作られるた だのファイルです。 このファイルは /var/lock に置かれます。以前は /usr/spool/uucp に置かれていました。Linux では、ロックファイ ルの名前は LCK..name となることがあります。ここで name はデバイス名か、UUCP のサイト名です。 ほとんどのプロセス(getty は除きます)は、そのデバイスに排他的にアクセス できるようになるためにロックファイルを作ります。 例えば、モデムを使ってダイアルアウトを行うと、誰かがモデムを使って いることをロックファイル(ひとつだけでないこともあります)が他のプロセス に伝えます。ロックファイルの内容は主に、デバイ スをロックしているプロセスの ID です。 ロックされているデバイスをどうしても使いたければ、プロセスは ロックファイルを無視して、とにかくデバイスを使ってしまってもよい点に 注意してください。これはテキスト端末にメッセージを送りたい時などに便利 です。

プログラムがシリアルポートを使おうとしたけれど、そのポートが ロックファイルでロックされている時は、このプログラムはロックファイルが 示す PID がまだ使われているかどうかを確認するはずです。 その PID が使われていなければロックは無効ということなので、(無効になっ たロックファイルを消してから)そのままポートを使っても大丈夫です。 残念ながらプログラムによってはこのような処理を行わず、実際には デバイスが使用中でなくてもデバイスが使用中だというメッセージを表示して あきらめてしまうものもあります。

ロックファイルがらみの問題は、同じデバイスが 2 つの別名を持っており、 その結果として別の名前を持つが実際には同じデバイスを示す ロックファイルが 2 つできる場合に起こる可能性があります。かつては 各々の物理シリアルポートは 2 つの異なるデバイス名(ttyS0 と cua0)を 持つことが有名でした。ロックをチェックするプログラムは ttyS と cua の 両方に対応していましたが、現在は cua がなくなったので処理は簡単になり ました。バージョンの古いプログラムはまだ cua を使っていることがありま す。別名を使うこと(/dev/modem で /dev/ttyS2 を示す等)はトラブルを自ら 招くようなものです。

10.3 デバイスファイルの所有者、グループ、パーミッションの変更

デバイスを使うには、ユーザ(setuid されている場合は、実行するプログラム) は /dev ディレクトリにあるデバイス「ファイル」を読み書きするための パーミッションを持っている必要があります。したがって、他の人がデバイス を使えないようにする筋の通った方法は、自分自身をそのデバイスの一時的な 所有者にし、他には誰も使えないようなパーミッションを設定することです。 このような処理をするプログラムもあります。 同じような方法として、デバイスファイルのグループも使えます。

ロックファイルは他のプロセスがデバイスを使えないようにしますが、 デバイスファイルの所有者/パーミッションの変更は他のユーザ(やグループ) がデバイスを使えないようにします。ひとつの状況として、グループに対して シリアルポートへの書き込みのパーミッションは与えられているけれど、 読み取りのパーミッションは出ていない場合があります。この場合、 ポートへの書き込みは単にテキスト端末へのメッセージ送信になるだけですが、 読み取りは悲惨なことになります。別のプログラムが先にデータを読み出して しまうと、データの読み取りの必要があった元々のプログラムの データがなくなってしまいます。このように、読み取りは書き込みよりも大き な害を及ぼすことがあります。 読み取りではデータがなくなりますが、書き込みでは 余計なデータが追加されるだけだからです。これが、書き込みは許しても 読み取りは許さない理由です。これは通常ファイルの場合とちょうど反対にな ります。通常ファイルでは他人に読み取りを許可しますが、書き込み(修正)は 許しません。シリアルポートを使う場合は普通、読み取りと書き込みの両方が 必要です。

デバイスファイルの属性を変更するプログラムは、終了時には変更した部分を 元に戻すはずです。しかし、異常終了した場合には、次に誰かが使おうとした 時に "permission denied" エラーが出るような状態のままの デバイスファイルが残ることがあります。


次のページ 前のページ 目次へ