ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° strace ΠΏΠΎΠΊΠ°Π·Π°Π»Π° ΠΌΠ΅ΡΠΊΠΈ ΠΏΠΎΠ»Π΅ΠΉ ΡΡΡΡΠΊΡΡΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΡΠ°Π½ΡΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ. ΠΡΠ° ΡΡΡΡΠΊΡΡΡΠ° Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅: Linux ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π² ΠΏΠΎΠ»Π΅ sys ΠΈΠΌΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, Π° Π² ΠΏΠΎΠ»Π΅ node β ΠΈΠΌΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°. Π€ΡΠ½ΠΊΡΠΈΡ uname() Π±ΡΠ΄Π΅Ρ ΠΎΠΏΠΈΡΠ°Π½Π° Π½ΠΈΠΆΠ΅, Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 8.15. "Π€ΡΠ½ΠΊΡΠΈΡ uname()".
Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² write() Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π½Π° ΡΠΊΡΠ°Π½. ΠΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ 1 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΌΡ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ. Π’ΡΠ΅ΡΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β ΡΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΈΡΠ»ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ².
write(1, "myhostname\n", 11) = 11
ΠΡΠ° ΡΡΡΠΎΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡΡΡ ΠΈΡΠΊΠ°ΠΆΠ΅Π½Π½ΠΎΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ²ΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ hostname ΡΠΌΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌΠΈ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ strace. ΠΡΠ»ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΡ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ , Π»ΡΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²ΠΈΡΡ Π²ΡΠ²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ strace Π² ΡΠ°ΠΉΠ» Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΡΠΈΠΈ -ΠΎ ΠΈΠΌΡ_ΡΠ°ΠΉΠ»Π°.
8.2. Π€ΡΠ½ΠΊΡΠΈΡ access(): ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠ°Π² Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ°ΠΉΠ»Ρ
Π€ΡΠ½ΠΊΡΠΈΡ access() ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΈΠΌΠ΅Π΅Ρ Π»ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ Π΅Π΅ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠ°Π²ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡ ΡΠ°ΠΉΠ»Ρ. Π€ΡΠ½ΠΊΡΠΈΡ ΡΠΏΠΎΡΠΎΠ±Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π»ΡΠ±ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ ΡΡΠ΅Π½ΠΈΡ, Π·Π°ΠΏΠΈΡΠΈ ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΠΊΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°.
Π€ΡΠ½ΠΊΡΠΈΡ access() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π²Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°: ΠΏΡΡΡ ΠΊ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌΠΎΠΌΡ ΡΠ°ΠΉΠ»Ρ ΠΈ Π±ΠΈΡΠΎΠ²ΠΎΠ΅ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠ»Π°Π³ΠΎΠ² R_OK, W_OK ΠΈ X_OK, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ ΠΏΡΠ°Π²Π°ΠΌ ΡΡΠ΅Π½ΠΈΡ, Π·Π°ΠΏΠΈΡΠΈ ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π²ΡΠ΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ 0. ΠΡΠ»ΠΈ ΡΠ°ΠΉΠ» ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, Π° Π½ΡΠΆΠ½ΡΠ΅ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ Π½Π° Π΄ΠΎΡΡΡΠΏ ΠΊ Π½Π΅ΠΌΡ Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΎΡΡΡΡΡΡΠ²ΡΡΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ -1 ΠΈ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ errno Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ EACCES (ΠΈΠ»ΠΈ EROFS, Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΠΏΡΠ°Π²ΠΎ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠ°ΠΉΠ», ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π² ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅, ΡΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ).
ΠΡΠ»ΠΈ Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΠ°Π²Π΅Π½ F_OK, ΡΡΠ½ΠΊΡΠΈΡ access() ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π»ΠΈΡΡ ΡΠ°ΠΊΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°. Π ΡΠ»ΡΡΠ°Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ 0, ΠΈΠ½Π°ΡΠ΅ β -1 (Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ errno ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ ENOENT). ΠΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ² Π½Π° ΠΏΡΡΠΈ ΠΊ ΡΠ°ΠΉΠ»Ρ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½, Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ errno Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΌΠ΅ΡΡΠ½ ΠΊΠΎΠ΄ EACCES.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 8.1, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ access() ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ Π»ΠΈ ΠΊ Π½Π΅ΠΌΡ Π΄ΠΎΡΡΡΠΏ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅/Π·Π°ΠΏΠΈΡΡ. ΠΠΌΡ ΡΠ°ΠΉΠ»Π° Π·Π°Π΄Π°Π΅ΡΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅.
ΠΠΈΡΡΠΈΠ½Π³ 8.1. (check-access.c) ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠ°Π² Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ°ΠΉΠ»Ρ#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
char* path = argv[1];
int rval;
/* ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°. */
rval = access(path, F_OK);
if (rval == 0)
printf("%s exists\n", path);
else {
if (errno == ENOENT)
printf("%s does not exist\n", path);
else if (errno == EACCES)
printf("%s is not accessible\n", path);
return 0;
}
/* ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ°. */
rval = access(path, R_OK);
if (rval == 0)
printf("%s is readable\n", path);
else
printf("%s is not readable (access denied)\n", path);
/* ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠ°Π²Π° Π·Π°ΠΏΠΈΡΠΈ. */
rval = access(path, W_OK);
if (rval == 0)
printf("%s is writable\n", path);
else if (errno == EACCES)
printf("%s is not writable (access denied)\n", path);
else if (errno == EROFS)
printf("%s is not writable (read-only filesystem)\n",
path);
return 0;
}
ΠΠΎΡ ΠΊΠ°ΠΊ, ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ°ΠΉΠ»Ρ README, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌΡ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅:
% ./check-access /mnt/cdrom/README
/mnt/cdrom/README exists
/mnt/cdrom/README is readable
/mnt/cdrom/README is not writable (read-only filesystem)
8.3. Π€ΡΠ½ΠΊΡΠΈΡ fcntl(): Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π°Π΄ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ
Π€ΡΠ½ΠΊΡΠΈΡ fcntl() β ΡΡΠΎ ΡΠΎΡΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΠΎΡΠΎΠ±ΡΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌ Π½Π°Π΄ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ. ΠΠ΅ΡΠ²ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π°, Π²ΡΠΎΡΡΠΌ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΠ»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ, ΡΡΠ΅ΡΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ. Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΎΠΏΠΈΡΠ°Π½Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠ°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ fcntl(): Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ².
Π€ΡΠ½ΠΊΡΠΈΡ fcntl() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π½Π° ΡΠ°ΠΉΠ» Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ΄ΠΈ Π·Π°ΠΏΠΈΡΠΈ. ΠΡΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΠΈΡΡΠ²Π°Π»ΠΈΡΡ Π² Π³Π»Π°Π²Π΅ 5, "ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²". ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅Π½ΠΈΡ ΡΡΠ°Π²ΠΈΡΡΡ Π½Π° ΡΠ°ΠΉΠ», Π΄ΠΎΡΡΡΠΏΠ½ΡΠΉ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π·Π°ΠΏΠΈΡΠΈ ΡΡΠ°Π²ΠΈΡΡΡ Π½Π° ΡΠ°ΠΉΠ», Π΄ΠΎΡΡΡΠΏΠ½ΡΠΉ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ. ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΌΠΎΠ³ΡΡ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΡΠ΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠ°ΠΉΠ»Π°, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ ΡΡΠ°Π²ΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π·Π°ΠΏΠΈΡΠΈ. Π€Π°ΠΉΠ» Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ ΠΈ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, ΠΈ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ. Π£ΡΡΠΈΡΠ΅, ΡΡΠΎ Π½Π°Π»ΠΈΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π΅ ΠΌΠ΅ΡΠ°Π΅Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ ΠΎΡΠΊΡΡΠ²Π°ΡΡ ΡΠ°ΠΉΠ» ΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΡΡΠ΅Π½ΠΈΠ΅/Π·Π°ΠΏΠΈΡΡ Π΅Π³ΠΎ Π΄Π°Π½Π½ΡΡ , Π΅ΡΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½ΠΈ ΡΠ°ΠΌΠΈ Π½Π΅ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ Π²ΡΠ·Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ fcntl().
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΡΡΠ°Π²ΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° ΡΠ°ΠΉΠ», Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈ ΠΎΠ±Π½ΡΠ»ΠΈΡΡ ΡΡΡΡΠΊΡΡΡΡ ΡΠΈΠΏΠ° flock. Π ΠΏΠΎΠ»Π΅ l_type Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π·Π°ΠΏΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° F_RDLCK Π² ΡΠ»ΡΡΠ°Π΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° F_WRLCK β Π² ΡΠ»ΡΡΠ°Π΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π·Π°ΠΏΠΈΡΠΈ. ΠΠ°Π»Π΅Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ fcntl(), ΠΏΠ΅ΡΠ΅Π΄Π°Π² Π΅ΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ F_SETLCKW ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡΡΠΊΡΡΡΡ ΡΠΈΠΏΠ° flock. ΠΡΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠΆΠ΅ Π±ΡΠ»Π° ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ, ΡΡΠ½ΠΊΡΠΈΡ fcntl() ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅Ρ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, ΠΏΠΎΠΊΠ° "ΠΌΠ΅ΡΠ°ΡΡΠ°Ρ" Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ½ΡΡΠ°.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 8.2 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ», Π° Π·Π°ΡΠ΅ΠΌ ΡΡΠ°Π²ΠΈΡ Π½Π° Π½Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π·Π°ΠΏΠΈΡΠΈ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΆΠ΄Π΅Ρ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡΠΈ <Enter>, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΡΠ½ΠΈΠΌΠ°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΈ Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ».
ΠΠΈΡΡΠΈΠ½Π³ 8.2. (lock-file.c) Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π·Π°ΠΏΠΈΡΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ fcntl()#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
char* file = argv[1];
int fd;
struct flock lock;
printf("opening %s\n", file);
/* ΠΡΠΊΡΡΡΠΈΠ΅ ΡΠ°ΠΉΠ»Π°. */
fd = open(file, O_WRONLY);
printf("locking\n");
/* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΡΡΠΊΡΡΡΡ flock. */
memset(&lock, 0, sizeof(lock));
lock.l_type = F_WRLCK;
/* Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π·Π°ΠΏΠΈΡΠΈ. */
fcntl(fd, F_SETLKW, &lock);
printf("locked; hit Enter to unlock... ");
/* ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡΠΈ <Enter>. */
getchar();
printf("unlocking\n");
/* Π‘Π½ΡΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. */
lock.l_type = F_UNLCK;
fcntl(fd, F_SETLKW, &lock);
close(fd);
return 0;
}
Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠΉΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Π΅Π΅ Ρ ΠΊΠ°ΠΊΠΈΠΌ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠ΅ΡΡΠΎΠ²ΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ, ΡΠΊΠ°ΠΆΠ΅ΠΌ, /tmp/test-file:
% cc -o lock-file lock-file.Ρ
% touch /tmp/test-file
% ./lock-file /tmp/test-file
opening /tmp/test-file
locking
locked; hit Enter to unlock...
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΡΠΊΡΠΎΠΉΡΠ΅ Π΄ΡΡΠ³ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈ Π²ΡΠ·ΠΎΠ²ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΅ΡΠ΅ ΡΠ°Π· Ρ ΡΠ΅ΠΌ ΠΆΠ΅ ΡΠ°ΠΉΠ»ΠΎΠΌ:
% ./lock-file /tmp/test-file
opening /tmp/test-file
locking
ΠΡΡΠ°ΡΡΡ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° ΡΠ°ΠΉΠ», ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ°ΠΌΠ° ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ. ΠΠ΅ΡΠ½ΠΈΡΠ΅ΡΡ Π² ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈ Π½Π°ΠΆΠΌΠΈΡΠ΅ <Enter>:
unlocking
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, Π·Π°ΠΏΡΡΠ΅Π½Π½Π°Ρ Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΠΎΠΊΠ½Π΅, Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ. ΠΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, ΡΡΠΎΠ±Ρ ΡΡΠ½ΠΊΡΠΈΡ fcntl() Π½Π΅ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠ»Π° Π² ΡΠ΅ΠΆΠΈΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π² ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Π΄Π°ΠΉΡΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠΎΠ΄Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ F_SETLCK, Π° Π½Π΅ F_SETLKW. ΠΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡ, ΡΡΠΎ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» ΡΠΆΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, ΠΎΠ½Π° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²Π΅ΡΠ½Π΅Ρ -1.
Π Linux ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² flock(), ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°. ΠΠΎ Ρ ΡΡΠ½ΠΊΡΠΈΠΈ fcntl() Π΅ΡΡΡ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ: ΠΎΠ½Π° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ NFS[28] (ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΈ, ΡΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ NFS ΠΈΠΌΠ΅Π΅Ρ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅Π΄Π°Π²Π½ΡΡ Π²Π΅ΡΡΠΈΡ ΠΈ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ). Π’Π°ΠΊ ΡΡΠΎ. ΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ Π΄Π²ΡΠΌ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ½ΡΠΈΡΡΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ΅ΡΠ΅Π· NFS, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° Π΄Π²ΡΡ ΡΠ°Π·Π½ΡΡ ΠΌΠ°ΡΠΈΠ½Π°Ρ .
8.4. Π€ΡΠ½ΠΊΡΠΈΠΈ fsync() ΠΈ fdatasync(): ΠΎΡΠΈΡΡΠΊΠ° Π΄ΠΈΡΠΊΠΎΠ²ΡΡ Π±ΡΡΠ΅ΡΠΎΠ²
Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠ°ΠΉΠ» Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π½Π° Π΄ΠΈΡΠΊ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΈΡ Π² ΡΠ΅Π·ΠΈΠ΄Π΅Π½ΡΠ½ΡΠΉ ΠΊΡΡ-Π±ΡΡΠ΅Ρ Ρ ΡΠ΅Π»ΡΡ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΡ ΡΠΈΡΠ»Π° ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΉ ΠΊ Π΄ΠΈΡΠΊΡ ΠΈ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠΎΠ³Π΄Π° Π±ΡΡΠ΅Ρ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡΠ΄Ρ Π΄ΡΡΠ³ΠΎΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΡΡΠ΅ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΠΊ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ), ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π°ΠΏΠΈΡΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π±ΡΡΠ΅ΡΠ° Π½Π° Π΄ΠΈΡΠΊ Π² Ρ ΠΎΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠΉ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ.
Π Linux ΡΠΎΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΠΏ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ±ΡΡΠ½ΠΎ ΠΎΠ½ ΡΠΏΠΎΡΠΎΠ±ΡΡΠ²ΡΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΌΡ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠΎ ΠΎΠ½ ΠΆΠ΅ Π΄Π΅Π»Π°Π΅Ρ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΡΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π·Π°Π²ΠΈΡΡΡΠΈΠ΅ ΠΎΡ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ Π΄ΠΈΡΠΊΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ . ΠΡΠ»ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ° Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ Π²ΡΠΉΠ΄Π΅Ρ ΠΈΠ· ΡΡΡΠΎΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π²ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΡΠ±ΠΎΡ ΡΠ΄ΡΠ° ΠΈΠ»ΠΈ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΈΡΠ°Π½ΠΈΡ, Π»ΡΠ±ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΠ΅ΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΈ Π΅ΡΠ΅ Π½Π΅ Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π½Π° Π΄ΠΈΡΠΊ, Π±ΡΠ΄ΡΡ ΠΏΠΎΡΠ΅ΡΡΠ½Ρ.