Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 42

Автор ΠΡ€Π½ΠΎΠ»ΡŒΠ΄ Роббинс

Ѐункция rpl_utime() (строки 75–82) являСтся «замСститСлСм utime()Β». Если Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π½Π΅ Ρ€Π°Π²Π΅Π½ NULL, ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π°ΡΡ‚ΠΎΡΡ‰ΡƒΡŽ utime(). Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ utime_null().

5.5.4. ИспользованиС fchown() ΠΈ fchmod() для обСспСчСния бСзопасности

Π’ исходных систСмах Unix Π±Ρ‹Π»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ chown() ΠΈ chmod(). Однако, Π½Π° сильно Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… систСмах эти систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² условия состязания, посрСдством Ρ‡Π΅Π³ΠΎ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ Ρ„Π°ΠΉΠ»Π°, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ измСняСтся Π²Π»Π°Π΄Π΅Π»Π΅Ρ† ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²Π° доступа.

Однако, послС открытия Ρ„Π°ΠΉΠ»Π° условиС состязания большС Π½Π΅ прСдставляСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ stat() с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„Π°ΠΉΠ»Π° для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ„Π°ΠΉΠ»Π΅. Если ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ свСдСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ оТидались, послС открытия Ρ„Π°ΠΉΠ»Π° fstat() ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый (сравнив поля st_dev ΠΈ st_ino структур struct stat Β«Π΄ΠΎΒ» ΠΈ «послС»).

Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ»Ρ‹ Ρ‚Π΅ ΠΆΠ΅ самыС, Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²Π° доступа ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ fchown() ΠΈΠ»ΠΈ fchmod().

Π­Ρ‚ΠΈ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ lchown(), ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΈΠ΅;[63] Π² старых систСмах Unix ΠΈΡ… Π½Π΅ Π±Ρ‹Π»ΠΎ, хотя Π² соврСмСнных совмСстимых с POSIX систСмах ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ.

Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ futime() ΠΈΠ»ΠΈ lutime() Π½Π΅Ρ‚. Π’ случаС futime() это (ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ) ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ критичСскими для бСзопасности систСмы Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ для владСния ΠΈ ΠΏΡ€Π°Π² доступа, lutime() отсутствуСт ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΈ нСумСстны для символичСских ссылок.

5.6. РСзюмС

β€’ Π˜Π΅Ρ€Π°Ρ€Ρ…ия Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², ΠΊΠ°ΠΊ ΠΎΠ½Π° видится ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, являСтся ΠΎΠ΄Π½ΠΈΠΌ логичСским Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ, ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ находится Π² /. Оно составлСно ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ², ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТит Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму. Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы Π² индСксах хранятся Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Ρ„Π°ΠΉΠ»Π°Ρ… (ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅), Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

β€’ ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ связь ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ индСксами. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ содСрТимоС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся просто ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ°Ρ€ (индСкс, имя). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° для Ρ„Π°ΠΉΠ»Π° называСтся (прямой) ссылкой, Π° Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ мноТСство ссылок. ΠŸΡ€ΡΠΌΡ‹Π΅ ссылки, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ лишь ΠΏΠΎ Π½ΠΎΠΌΠ΅Ρ€Ρƒ индСкса, всС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС. БимволичСскиС ссылки ΡΠ²Π»ΡΡŽΡ‚ΡΡ указатСлями Π½Π° Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° основС ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°, Π° Π½Π΅ Π½ΠΎΠΌΠ΅Ρ€Π° индСкса, поэтому ΠΈΡ… использованиС Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмой.

β€’ ΠŸΡ€ΡΠΌΡ‹Π΅ ссылки ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ link(), символичСскиС ссылки ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ symlink(), ссылки ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ unlink(), Π° ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ (с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ rename(). Π‘Π»ΠΎΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π° Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° счСтчик ссылок Π½Π΅ достигнСт нуля ΠΈ Π½Π΅ закроСтся послСдний ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ дСскриптор Ρ„Π°ΠΉΠ»Π°.

β€’ ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ mkdir(), Π° ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ rmdir(); ΠΏΠ΅Ρ€Π΅Π΄ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ пустым (Π½Π΅ оставлСно Π½ΠΈΡ‡Π΅Π³ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ '.' ΠΈ '..'). GNU/Linux вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ISO Π‘ remove() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ unlink() ΠΈΠ»ΠΈ rmdir().

β€’ ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ opendir(), readdir(), rewinddir() ΠΈ closedir(). struct dirent содСрТит Π½ΠΎΠΌΠ΅Ρ€ индСкса ΠΈ имя Ρ„Π°ΠΉΠ»Π°. Максимально пСрСносимый ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π² Ρ‡Π»Π΅Π½Π΅ d_name Ρ‚ΠΎΠ»ΡŒΠΊΠΎ имя Ρ„Π°ΠΉΠ»Π°. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ BSD telldir() ΠΈ seekdir() для сохранСния ΠΈ восстановлСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ полоТСния Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ доступны, Π½ΠΎ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ пСрСносимы, ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ.

β€’ Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСмСйства систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² stat(), структура struct stat содСрТит всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ„Π°ΠΉΠ»Π΅ Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°. (Π’ самом Π΄Π΅Π»Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ мноТСство ΠΈΠΌΠ΅Π½ ΠΈΠ»ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ совсСм Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ ссылок, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ имя доступным.)

β€’ ΠœΠ°ΠΊΡ€ΠΎΡ S_ISxxx() Π² <sys/stat.h> Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ Ρ„Π°ΠΉΠ»Π°. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ major() ΠΈ minor() ΠΈΠ· <sys/sysmacros.h> Π΄Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ dev_t, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Π±Π»ΠΎΡ‡Π½Ρ‹Π΅ ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ устройства.

β€’ Π‘имволичСскиС ссылки ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, использовав lstat(), Π° ΠΏΠΎΠ»Π΅ st_size структуры struct stat для символичСской ссылки Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число Π±Π°ΠΉΡ‚ΠΎΠ², Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для размСщСния ΠΈΠΌΠ΅Π½ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ символичСской ссылки Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ readlink(). НуТно ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° Π±Ρ‹Π» ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π° Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π±Π°ΠΉΡ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС строки Π‘.

β€’ ΠΠ΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅: сСмСйство chown() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для смСны Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ chmod() для ΠΏΡ€Π°Π² доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ, a utime() для измСнСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ доступа ΠΈ измСнСния Ρ„Π°ΠΉΠ»Π°.

УпраТнСния

1. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ 'const char *fmt_mode(mode_t mode)'. Π’Π²ΠΎΠ΄ прСдставляСт собой Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ mode_t, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ ΠΈΠ· поля st_mode структуры struct stat; Ρ‚.Π΅. ΠΎΠ½ΠΎ содСрТит ΠΊΠ°ΠΊ Π±ΠΈΡ‚Ρ‹ ΠΏΡ€Π°Π² доступа, Ρ‚Π°ΠΊ ΠΈ Ρ‚ΠΈΠΏΠ° Ρ„Π°ΠΉΠ»Π°.

Π’Ρ‹Π²ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ строку Π² 10 символов, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ полю Π²Ρ‹Π²ΠΎΠ΄Π° 'ls -l'. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ Ρ„Π°ΠΉΠ»Π°, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π΅Π²ΡΡ‚ΡŒ β€” ΠΏΡ€Π°Π²Π° доступа.

Когда установлСны Π±ΠΈΡ‚Ρ‹ S_ISUID ΠΈ S_IXUSR, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ s вмСсто x; Ссли установлСн лишь Π±ΠΈΡ‚ I_ISUID, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ S. Π’ΠΎ ΠΆΠ΅ относится ΠΊ Π±ΠΈΡ‚Π°ΠΌ S_ISGID ΠΈ S_IXGRP. Если установлСны ΠΎΠ±Π° Π±ΠΈΡ‚Π° S_ISVTX ΠΈ S_IXOTH, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ t; для ΠΎΠ΄Π½ΠΎΠ³ΠΎ S_ISVTX ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ T.

Для простоты ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ статичСский (static) Π±ΡƒΡ„Π΅Ρ€, содСрТимоС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ пСрСзаписываСтся ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹.

2. Π”ΠΎΡ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ ch05-catdir.c, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π»Π° stat() для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²Π΅Π΄ΠΈΡ‚Π΅ Π½ΠΎΠΌΠ΅Ρ€ индСкса, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° fmt_mode(), число ссылок ΠΈ имя Ρ„Π°ΠΉΠ»Π°.

3. Π”ΠΎΡ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ ch05-catdir.c Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Ссли Ρ„Π°ΠΉΠ» являСтся символичСской ссылкой, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ имя ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.

4. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ‚Π°ΠΊΡƒΡŽ ΠΎΠΏΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎ Ссли имя Ρ„Π°ΠΉΠ»Π° являСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° рСкурсивно Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π½Π΅Π³ΠΎ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ свСдСния ΠΎ Ρ„Π°ΠΉΠ»Π°Ρ… (ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…) этого ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. НСобходим лишь ΠΎΠ΄ΠΈΠ½ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ рСкурсии.

5. Π•сли Π²Ρ‹ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π½Π° систСмС GNU/Linux, запуститС ch05-trymkdir (см. Ρ€Π°Π·Π΄Π΅Π» 5.2 Β«Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²Β») Π½Π° своСй систСмС ΠΈ сравнитС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌΠΈ Π½Π°ΠΌΠΈ.

6. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ mkdir. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ свою Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΠΏΡ€Π°Π²ΠΎΡ‡Π½ΡƒΡŽ страницу для mkdir(1) ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ всС Π΅Π΅ ΠΎΠΏΡ†ΠΈΠΈ.

7. Π’ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, /, ΠΊΠ°ΠΊ Π½ΠΎΠΌΠ΅Ρ€ устройства, Ρ‚Π°ΠΊ ΠΈ Π½ΠΎΠΌΠ΅Ρ€ индСкса для '.' ΠΈ '..' ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ pwd.

Π’Π½Π°Ρ‡Π°Π»Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°ΠΉΡ‚ΠΈ имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π² содСрТимоС Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ свСдСния ΠΎ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы, ΠΏΠΎΠΊΠ° Π½Π΅ достигнСт ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС, ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π΄ΠΎ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ, Π»Π΅Π³ΠΊΠΎ. Как Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ ваша вСрсия pwd с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΡ‚ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π²Π½ΠΈΠ·?

8. Π•сли Π²Ρ‹ написали pwd, использовав Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π΅Π΅ снова, использовав ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ. Если Π²Ρ‹ использовали ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π΅Π΅ с использованиСм рСкурсии. Π§Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅? (Подсказка: рассмотритС ΠΎΡ‡Π΅Π½ΡŒ Π³Π»ΡƒΠ±ΠΎΠΊΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π΄Π΅Ρ€Π΅Π²ΡŒΡ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ².)

9. Π’Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ исслСдуйтС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ rpl_utime() (см. Ρ€Π°Π·Π΄Π΅Π» 5.5.3.1 «ПоддСлка utime(file, NULL)Β»). Какой рСсурс Π½Π΅ восстанавливаСтся, Ссли ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π² сСрСдинС if Π½Π΅ выполняСтся? (Бпасибо Π”ΠΆΠ΅Ρ„Ρ„Ρƒ КольС (Geoff Collyer).)

10. (Π’Ρ€ΡƒΠ΄Π½ΠΎΠ΅) ΠŸΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ страницу справки для chmod(1). ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠ΄ для Π°Π½Π°Π»ΠΈΠ·Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° символичСских ΠΎΠΏΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ, ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²Π° доступа Π½Π° основС Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°, Π³Ρ€ΡƒΠΏΠΏΡ‹, Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈ «всСх».

Когда Π²Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ chmod, которая примСняСт Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²Π° доступа ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. ΠšΠ°ΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ‹ использовали, chmod() β€” ΠΈΠ»ΠΈ open() ΠΈ fchmod() β€” ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ?

Π“Π»Π°Π²Π° 6

ΠžΠ±Ρ‰ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ интСрфСйсы β€” Ρ‡Π°ΡΡ‚ΡŒ 1

Π’ Π³Π»Π°Π²Π΅ 5 Β«ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΈ слуТСбныС Π΄Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Β» ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ нСпосрСдствСнноС Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½ΠΈ хранятся Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ struct stat содСрТит всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ„Π°ΠΉΠ»Π΅ Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Однако, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ этой структуры Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСпосрСдствСнно; ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ просто числовыми значСниями.