システムインタフェース

アドバイザリロッキングと強制ロッキングの選択

強制ロッキングの場合、対象のファイルは set-group 識別 (setgid) グループ ID 設定ビットがオンになっており、グループの実行権がオフになっている通常ファイルでなければなりません。どちらかの条件が満たされなければ、すべてのレコードロッキングはアドバイザリロッキングになります。強制ロッキングを使用するには、次の例のようにします。

#include <sys/types.h>
#include <sys/stat.h>

 int mode;
 struct stat buf;
 	...
 	if (stat(filename, &buf) < 0) {
 		perror("program");
 		exit (2);
 	}
 	/* 現在設定されているモードを取得する */
 	mode = buf.st_mode;
 	/* グループの実効権をモードから削除する */
 	mode &= ‾(S_IEXEC>>3);
 		/* set-group 識別 (setgid) ビットをモードに設定する */
 	mode |= S_ISGID;
 	if (chmod(filename, mode) < 0) {
 		perror("program");
 		exit(2);
 	}
 	... 

レコードロッキングが適用されるファイルの場合は、実行権を設定しないでください。これは、オペレーティングシステムはファイルの実行時にレコードロッキングを無視するからです。

ファイルに強制ロッキングを設定するには、chmod(1) コマンドも使用できます。このコマンドを使用すると次のようになります。

$ chmod +l file

上記の l は、数字の "1" ではなく英字の "l" (エル) なので注意してください。このコマンドは、ファイルモード内の 2 個のアクセス権ビットを設定します。アクセス権ビットは、ファイル上の強制ロッキングを示します。モード内の 2 つのビットは、.1./.../..0/... となります。各ファイルの強制ロッキングを有効にすると同時に、実行時 set-group 識別 (setgid) ビットをオンにできません。また、各ファイルの強制ロッキングとグループの実行権を有効にすることもできません。

ls(1) コマンドで -l オプションを使用してロングリスト形式を指定すると、この設定が表示されます。

$ ls -l file

この場合、次のような情報が表示されます。

-rw---l--- 1 user group size mod_time file

アクセス権の英字 "l" は、set-group 識別 (setgid) ビットがオンになっていることを示します。したがって、通常の set-group 識別 (setgid) ビットがオンになるだけでなく強制ロッキングが有効になっています。