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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 38

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

#include <errno.h>

extern int errno;

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ errno. Оно достовСрно, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° функция Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ. Π’Π°ΠΌ слСдуСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сразу ΠΆΠ΅, ΠΊΠ°ΠΊ функция сообщила ΠΎ сбоС. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, скопируйтС это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ fprintf, ΠΌΠΎΠ³ΡƒΡ‚ сами ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ errno.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ состояниС Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π»ΠΈ ошибка ΠΈΠ»ΠΈ достигнут ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°.

#include <stdio.h>

int ferror(FILE *stream);

int feof(FILE *stream);

void clearerr(FILE *stream);

Ѐункция ferror провСряСт ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ошибок ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ установлСн, ΠΈ ноль Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС.

Ѐункция feof провСряСт ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ установлСн, ΠΈΠ»ΠΈ ноль Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠΉΡ‚Π΅ Π΅Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

if (feof(some_stream))

 /* ΠœΡ‹ Π² ΠΊΠΎΠ½Ρ†Π΅ */

Ѐункция clearerr ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π° ΠΈ ошибки для ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ stream. Она Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния, ΠΈ для Π½Π΅Π΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ ошибки. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для сброса состояния ошибки Π² ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ записи Π² ΠΏΠΎΡ‚ΠΎΠΊ послС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, связанной с ошибкой "disk full" (диск Π·Π°ΠΏΠΎΠ»Π½Π΅Π½).

ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΠΈ дСскрипторы Ρ„Π°ΠΉΠ»ΠΎΠ²

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ассоциирован с Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌ дСскриптором Ρ„Π°ΠΉΠ»Π°. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° с высокоуровнСвыми ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΌΠΈ опСрациями, Π½ΠΎ это, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ эффСкт ΠΎΡ‚ примСнСния Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ.

#include <stdio.h>

int fileno(FILE *stream);

FILE *fdopen(int fildes, const char *mode);

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ дСскриптор Ρ„Π°ΠΉΠ»Π° примСняСтся для Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π²Ρ‹Π·Π²Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fileno. Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ дСскриптор Ρ„Π°ΠΉΠ»Π° для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ»ΠΈ -1 Π² случаС сбоя. Π­Ρ‚Π° функция ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΏΡ€ΠΈ нСобходимости Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ доступа ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fstat ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ этому ΠΏΠΎΡ‚ΠΎΠΊΡƒ.

МоТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Ρ„Π°ΠΉΠ»Π° Π½Π° основС дСскриптора Ρ„Π°ΠΉΠ»Π°, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fdopen. По сущСству, эта функция прСдоставляСт Π±ΡƒΡ„Π΅Ρ€Ρ‹ stdio для ΡƒΠΆΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ дСскриптора, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ самый Π»Π΅Π³ΠΊΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ объяснСния Π΅Π΅ назначСния.

Ѐункция fdopen дСйствуСт Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ функция fopen, Π½ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΎΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ дСскриптор Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ² open для создания Ρ„Π°ΠΉΠ»Π°, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ для Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ½ΠΊΠΎΠ³ΠΎ управлСния ΠΏΡ€Π°Π²Π°ΠΌΠΈ доступа, Π½ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ для записи Π² Ρ„Π°ΠΉΠ». ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ mode Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fopen ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ совмСстим с Ρ€Π΅ΠΆΠΈΠΌΠ°ΠΌΠΈ доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ, установлСнными ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Ρ„Π°ΠΉΠ»Π°. Ѐункция fdopen Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ»ΠΈ NULL Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.

Π’Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ созданиСм ΠΈ Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ².

chmod

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π° chmod Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΡ€Π°Π²Π° доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ. Он Π»Π΅ΠΆΠΈΡ‚ Π² основС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ chmod.

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° синтаксичСская запись Π²Ρ‹Π·ΠΎΠ²Π°:

#include <sys/stat.h>

int chmod(const char *path, mode_t mode);

ΠŸΡ€Π°Π²Π° доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ, Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ path, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² соотвСтствии со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° mode. Π Π΅ΠΆΠΈΠΌ Ρ„Π°ΠΉΠ»Π° mode задаСтся ΠΊΠ°ΠΊ Π² систСмном Π²Ρ‹Π·ΠΎΠ²Π΅ open с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ поразрядной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ OR, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΡ€Π°Π²Π° доступа. Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅ Π΄Π°Π½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ полномочия, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π»Π°Π΄Π΅Π»Π΅Ρ† Ρ„Π°ΠΉΠ»Π° ΠΈ ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΡ€Π°Π²Π° доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ.

chown

Π‘ΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π° chown.

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

int chown(const char *path, uid_t owner, gid_t group); 

Π’ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ числовыС значСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² (ID) Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹ (взятыС ΠΈΠ· систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² getuid ΠΈ getgid) ΠΈ систСмная Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ для ограничСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Ρ„Π°ΠΉΠ»Π°. Π’Π»Π°Π΄Π΅Π»Π΅Ρ† ΠΈ Π³Ρ€ΡƒΠΏΠΏΠ° Ρ„Π°ΠΉΠ»Π° ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ, Ссли Π·Π°Π΄Π°Π½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ полномочия.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ POSIX Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ допускаСт сущСствованиС систСм, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΡ€Π°Π²Π° владСния Ρ„Π°ΠΉΠ»ΠΎΠΌ. ВсС "ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅" с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния POSIX систСмы Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ этого, Π½ΠΎ строго говоря, это Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ стандарта (Π² FIPS 151-2). ВсС Π²ΠΈΠ΄Ρ‹ систСм, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ Π² этой ΠΊΠ½ΠΈΠ³Π΅, ΠΏΠΎΠ΄Ρ‡ΠΈΠ½ΡΡŽΡ‚ΡΡ спСцификации XSI (X/Open System Interface) ΠΈ ΡΠΎΠ±Π»ΡŽΠ΄Π°ΡŽΡ‚ Π½Π° Π΄Π΅Π»Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° владСния.

unlink, link ΠΈ symlink

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° unlink Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ».

БистСмный Π²Ρ‹Π·ΠΎΠ² unlink удаляСт запись ΠΎ Ρ„Π°ΠΉΠ»Π΅ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ счСтчик ссылок Π½Π° Ρ„Π°ΠΉΠ». Он Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0, Ссли ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ссылки ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΈ -1 Π² случаС ошибки. Для выполнСния Π²Ρ‹Π·ΠΎΠ²Π° Ρƒ вас Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π°Π²Π° Π½Π° запись ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, хранящСм ссылку Π½Π° Ρ„Π°ΠΉΠ».

#include <unistd.h>

int unlink(const char *path);

int link(const char *path1, const char *path2);

int symlink(const char *path1, const char *path2);

Если счСтчик становится Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ ΠΈ Ρ„Π°ΠΉΠ» Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Π½ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ процСссС, ΠΎΠ½ удаляСтся. Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ элСмСнт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° всСгда удаляСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π° мСсто, занятоС содСрТимым Ρ„Π°ΠΉΠ»Π°, Π½Π΅ очищаСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° послСдний процСсс (Ссли Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ сущСствуСт) Π½Π΅ Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚ Ρ„Π°ΠΉΠ». Π­Ρ‚ΠΎΡ‚ Π²Ρ‹Π·ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° rm. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ссылки, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»Π°, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ln. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ссылки Π½Π° Ρ„Π°ΠΉΠ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π° link.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° open ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ unlink для этого Ρ„Π°ΠΉΠ»Π° β€” Ρ‚Ρ€ΡŽΠΊ, примСняСмый Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ программистами для создания Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Π­Ρ‚ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ доступны ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹; ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ автоматичСски, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹.

БистСмный Π²Ρ‹Π·ΠΎΠ² link создаСт Π½ΠΎΠ²ΡƒΡŽ ссылку Π½Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» path1. Новый элСмСнт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° задаСтся Π² path2. БимволичСскиС ссылки ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π° symlink. Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ символичСскиС ссылки Π½Π° Ρ„Π°ΠΉΠ» Π½Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика ссылок ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… (ТСстких) ссылок, Π½Π΅ ΠΌΠ΅ΡˆΠ°ΡŽΡ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ Ρ„Π°ΠΉΠ»Π°.

mkdir ΠΈ rmdir

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, примСняя систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ mkdir ΠΈ rmdir.

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

int mkdir(const char *path, mode_t mode);

БистСмный Π²Ρ‹Π·ΠΎΠ² mkdir ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈ эквивалСнтСн ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ mkdir. Π’Ρ‹Π·ΠΎΠ² mkdir Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ path. ΠŸΡ€Π°Π²Π° доступа ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ mode ΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ опция ΠΎ O_CREAT Π² систСмном Π²Ρ‹Π·ΠΎΠ²Π΅ open ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ зависят ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ umask.

#include <unistd.h>

int rmdir(const char *path);

БистСмный Π²Ρ‹Π·ΠΎΠ² rmdir удаляСт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΠ½ΠΈ пустыС. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° rmdir ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ этот систСмный Π²Ρ‹Π·ΠΎΠ² для выполнСния Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

chdir ΠΈ getcwd

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ пСрСмСщаСтся ΠΏΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС. Как Π²Ρ‹ примСняСтС Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ cd для смСны ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ систСмный Π²Ρ‹Π·ΠΎΠ² chdir.

#include <unistd.h>

int chdir(const char *path);

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ свой Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π²Ρ‹Π·Π²Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getcwd.

#include <unistd.h>

char *getcwd(char *buf, size_t size);

Ѐункция getcwd записываСт имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ buf. Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ NULL, Ссли имя ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° прСвысит Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° (ошибка ERANGE), Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ size. Π’ случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ buf.

Ѐункция getcwd ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL, Ссли Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΡƒΠ΄Π°Π»Π΅Π½ (EINVAL) ΠΈΠ»ΠΈ измСнились Π΅Π³ΠΎ ΠΏΡ€Π°Π²Π° доступа (EACCESS).