強制ロックの場合、対象のファイルはグループ ID の設定ビットがオンになっており、グループの実行権がオフになっている通常ファイルでなければなりません。どちらかの条件が欠けていると、すべてのレコードロックはアドバイザリロックになります。
次のように強制ロックを設定します。
#include <sys/types.h> #include <sys/stat.h> int mode; struct stat buf; ... if (stat(filename, &buf) < 0) { perror("program"); exit (2); } /* get currently set mode */ mode = buf.st_mode; /* remove group execute permission from mode */ mode &= ~(S_IEXEC>>3); /* set 'set group id bit' in mode */ mode |= S_ISGID; if (chmod(filename, mode) < 0) { perror("program"); exit(2); } ...
ファイルを実行するとき、オペレーティングシステムはレコードロックを無視します。レコードロックが適用されるファイルには実行権を設定しないでください。
ファイルに強制ロックを設定するには、次のように chmod(1) コマンドも使用可能です。
$ chmod +l file |
このコマンドはファイルモード内に O20n0 アクセス権ビットを設定します。これはファイルの強制ロックを示します。n が偶数の場合、そのビットは強制ロックを有効にすると解釈され、n が奇数の場合、そのビットは「実行時グループ ID 設定」として解釈されます。
この設定を表示するには、ls(1) コマンドに -l オプション (ロングリスト形式) を指定して実行します。
$ ls -l file |
すると、次のような情報が表示されます。
-rw---l--- 1 user group size mod_time file |
アクセス権の文字「l」は、グループ ID の設定ビットがオンであることを示します。グループ ID の設定ビットがオンであるので、強制ロックは有効です。グループ ID の設定ビットの通常の意味論も有効です。