Selecting Advisory or Mandatory Locking
For mandatory locks, the file must be a regular file with the set-group-ID bit on and the group execute permission off. If either condition fails, all record locks are advisory.
Set a mandatory lock as follows.
#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); } ...
The operating system ignores record locks when the system is executing a file. Any files with record locks should not have execute permissions set.
The chmod
command can also be used to set a file to permit mandatory locking. For more information, see the
chmod
(1) man page.
$ chmod +l file
This command sets the O20n0
permission bit in the file mode, which indicates mandatory locking on the file. If n is even, the bit is interpreted as enabling mandatory locking. If n is odd, the bit is interpreted as set group ID on execution".
The ls
command shows this setting when you ask for the long listing format with the -l
option:
$ ls -l file
This command displays the following information:
-rw---l--- 1 user group size mod_time file
The letter "l
" in the permissions indicates that the set-group-ID bit is on. Because the set-group-ID bit is on, mandatory locking is enabled. Normal semantics of set-group-ID are also enabled.
For more information, see the
ls
(1) man page.