$ <b>echo hello, world > myfile</b> /* Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ» */$ <b>ls -l myfile</b> /* ΠΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° */-rw-r--r-- 1 arnold devel 13 Apr 3 17:11 myfile$ <b>chmod g+s myfile</b> /* ΠΠΎΠ±Π°Π²ΠΈΡΡ Π±ΠΈΡ setgid */$ <b>ls -l myfile</b> /* ΠΠΎΠΊΠ°Π·Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° */-rw-r-Sr-- 1 arnold devel 13 Apr 3 17:11 myfileΠΠΈΡ ΠΏΡΠ°Π²Π° Π½Π° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π³ΡΡΠΏΠΏΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΡΡΠ°Π²Π»Π΅Π½ ΡΠ±ΡΠΎΡΠ΅Π½Π½ΡΠΌ.
SsΠΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΡΠ° setgid ΠΈ ΡΠ±ΡΠΎΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΡΠ° ΠΏΡΠ°Π²Π° Π½Π° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π³ΡΡΠΏΠΏΠΎΠΉ ΠΎΠ±ΡΡΠ½ΠΎ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΠΎ. ΠΠΎ ΡΡΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅, ΠΎΠ½Π° Π±ΡΠ»Π° Π²ΡΠ±ΡΠ°Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ System V Π΄Π»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ Β«ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡΒ». Π Π² ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ Π±ΠΈΡΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΊΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Unix, ΡΠ°ΠΊΡΡ ΠΊΠ°ΠΊ Solaris, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΠ°ΠΉΠ»ΠΎΠ².
ΠΠ° ΡΠΈΡΡΠ΅ΠΌΠ°Ρ GNU/Linux Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄ΡΡΠ³Π°Ρ ΠΈΡΡΠΎΡΠΈΡ. ΠΠ»Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΡΠ°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ Π±ΠΈΡ setgid, Π½ΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ. Π€Π°ΠΉΠ»ΠΎΠ²Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ ΡΠ°ΠΉΠ», ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½Π° Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ
mandmountΠΡ ΡΠΆΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ, ΡΠ°Π·Π΄Π΅Π»Ρ Π΄ΠΈΡΠΊΠ°, ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ mount, Π³Π»Π°Π²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 8.1 Β«ΠΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π΅ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΒ». ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° Π³ΠΈΠ±ΠΊΠΎΠΌ Π΄ΠΈΡΠΊΠ΅. ΠΠ»Ρ Π½Π°ΡΠ°Π»Π°, Π²ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°:
1Β /* ch14-lockall.c --- ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. */23 Β #include <stdio.h> /* Π΄Π»Ρ fprintf(), stderr, BUFSIZ */4Β #include <errno.h> /* ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ errno */5Β #include <fcntl.h> /* Π΄Π»Ρ ΡΠ»Π°Π³ΠΎΠ² open() */6Β #include <string.h> /* ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ strerror() */7Β #include <unistd.h> /* Π΄Π»Ρ ssize_t */8Β #include <sys/types.h>9Β #include <sys/stat.h> /* Π΄Π»Ρ mode_t */1011 int12 main(int argc, char **argv)13 {14Β int fd;15Β int i, j;16Β mode_t rw_mode;17Β static char message[] = "hello, world\n";18Β struct flock lock;1920Β if (argc != 2) {21Β Β fprintf(stderr, "usage: %s file\n", argv[0]);22Β Β exit(1);23Β }2425Β rw_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; / * 0644 */26Β fd = open(argv[1], O_RDWR|O_TRUNC|O_CREAT|O_EXCL, rw_mode);27Β if (fd < 0) {28Β Β fprintf(stderr, "%s: %s: cannot open for read/write: %s\n",29Β Β Β argv[0], argv[1], strerror(errno));30Β Β (void)close(fd);31Β Β return 1;32Β }3334Β if (write(fd, message, strlen(message)) != strlen(message)) {35Β Β fprintf(stderr, "%s: %s: cannot write: %s\n",36Β Β Β argv[0], argv[1], strerror(errno));37Β Β (void)close(fd);38Β Β return 1;39Β }4041Β rw_mode |= S_ISGID; /* Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π±ΠΈΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ */4243Β if (fchmod(fd, rw_mode) < 0) {44Β Β fprintf(stderr, "%s: %s: cannot change mode to %o: %s\n",45Β Β Β argv[0], argv[1], rw_mode, strerror(errno));46Β Β (void)close(fd);47Β Β Β return 1;48Β Β }4950Β /* Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ» */51Β memset(&lock, '\0', sizeof(lock));52Β lock.l_whence = SEEK_SET;53Β lock.l_start = 0;54Β lock.l_len =0; /* Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π° */55Β lock.l_type = F_WRLCK; /* Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ */5657Β if (fcntl(fd, F_SETLK, &lock) < 0) {58Β Β fprintf(stderr, "%s: %s: cannot lock the file: %s\n",59Β Β Β argv[0], argv[1], strerror(errno));60Β Β (void)close(fd);61Β Β return 1;62Β }6364Β pause();6566Β (void)close(fd);6768Β return 0;69 }ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°ΠΉΠ», ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ (ΡΡΡΠΎΠΊΠΈ 25 ΠΈ 26). ΠΠ°ΡΠ΅ΠΌ ΠΎΠ½Π° Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² ΡΠ°ΠΉΠ» Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ (ΡΡΡΠΎΠΊΠ° 34). Π‘ΡΡΠΎΠΊΠ° 41 Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΊ ΠΏΡΠ°Π²Π°ΠΌ Π΄ΠΎΡΡΡΠΏΠ° Π±ΠΈΡ setgid, Π° ΡΡΡΠΎΠΊΠ° 43 ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΠΈΡ . (Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ²
fchmod()chmod()fchmod()Π‘ΡΡΠΎΠΊΠΈ 51β55 ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ
struct flockpause()