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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 41

Автор РобачСвский АндрСй ΠœΠΈΡ…Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‡

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма UNIX - img_21.jpeg

Рис. 2.9. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°

Бвязи

Π’ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы UNIX хранится число связСй, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π΅ количСство ΠΈΠΌΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». НапримСр, Ρ„Π°ΠΉΠ»Ρ‹ /etc/init.d/lp (ΠΈΠ»ΠΈ /etc/lp), /etc/rc0.d/K201p, /etc/rc2.d/K201p ΠΈ /etc/rc2.d/S801p ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, Π½ΠΎ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ физичСский Ρ„Π°ΠΉΠ» (Ρ‚ΠΎΡ‡Π½Π΅Π΅, ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Π°) ΠΈ Ρ‚Π΅ΠΌ самым ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ доступ ΠΊ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹ΠΌ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС число связСй Ρ„Π°ΠΉΠ»Π° Ρ€Π°Π²Π½ΠΎ 4. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»Π° удаляСтся, число связСй соотвСтствСнно ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ. Когда ΠΎΠ½ΠΎ достигнСт нуля β€” Π΄Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Π° Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹. Π’Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ связи называСтся ТСсткой.

ЖСсткая связь создаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π° link(2):

#include <unistd.h>

int link(const char *existing, const char *new);

ΠŸΡ€ΠΈ этом Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π° новая запись ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ

new
ΠΈ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ inode ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ Π½Π° ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Π°
existing
. Π’Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΎ число связСй. Π­Ρ‚ΠΈΠΌ систСмным Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ, Π² частности, ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° ln(1), рассмотрСнная Π² Π³Π»Π°Π²Π΅ 1.

Для удалСния ТСсткой связи ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ систСмный Π²Ρ‹Π·ΠΎΠ² unlink(2):

#include <unistd.h>

int unlink(const char *path);

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

Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ТСстким связям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊΠ°ΠΊ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ Π² Π³Π»Π°Π²Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ СстСствСнным способом адрСсации Π΄Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°, Π² UNIX ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ символичСскиС связи, Π°Π΄Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠ΅ Π½Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Π°, Π° Π΅Π³ΠΎ имя. НапримСр, Ссли Ρ„Π°ΠΉΠ» являСтся символичСской связью, Ρ‚ΠΎ Π² Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… хранится имя Ρ„Π°ΠΉΠ»Π°, Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ косвСнно Π°Π΄Ρ€Π΅ΡΡƒΡŽΡ‚ΡΡ.

БимволичСская связь позволяСт косвСнно Π°Π΄Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„Π°ΠΉΠ» Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы. БистСмный Π²Ρ‹Π·ΠΎΠ² symlink(2) слуТит для создания символичСской связи. Π­Ρ‚ΠΈΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ, кстати, ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° ln -s.

#include <unistd.h>

int symlink (const char *name, const char *synmame);

ПослС создания символичСской связи, доступ ΠΊ Ρ†Π΅Π»Π΅Π²ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ name ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ

symname
. ΠŸΡ€ΠΈ этом, функция open(2), принимая Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° имя символичСской связи, Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„Π°ΠΉΠ». Вакая ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ называСтся слСдованиСм символичСской связи. НС всС систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ этим свойством. НапримСр, систСмный Π²Ρ‹Π·ΠΎΠ² unlink(2), ΡƒΠ΄Π°Π»ΡΡŽΡ‰ΠΈΠΉ запись Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, дСйствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° саму ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ связь. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, ΠΌΡ‹ Π½Π΅ ΠΈΠΌΠ΅Π»ΠΈ Π±Ρ‹ возмоТности ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΅Π΅. Π’ Ρ‚Π°Π±Π». 2.11 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с символичСскими связями Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹.

Π’Π°Π±Π»ΠΈΡ†Π° 2.11. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡ символичСской связи Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ систСмными Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ

БистСмный Π²Ρ‹Π·ΠΎΠ² Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ символичСской связи НС слСдуСт символичСской связи
access(2) +
chdir(2) +
chmod(2) +
chown(2) +
lchown(2) +
creat(2) +
exec(2) +
link(2) +
mkdir(2) +
mknod(2) +
open(2) +
readlink(2) +
rename(2) +
stat(2) +
lstat(2) +
unlink(2) +

Для чтСния содСрТимого Ρ„Π°ΠΉΠ»Π° β€” символичСской связи ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ систСмный Π²Ρ‹Π·ΠΎΠ² readlink(2):

#include <unistd.h>

int readlink(const char *path, void *buf, size_t bufsiz);

АргумСнт

path
содСрТит имя символичСской связи. Π’ Π±ΡƒΡ„Π΅Ρ€Π΅
buf
Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ
bufsiz
возвращаСтся содСрТимоС Ρ„Π°ΠΉΠ»Π° β€” символичСской связи.

Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΊ Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ рассуТдСниям ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая сначала Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ содСрТимоС символичСской связи, Π° Π·Π°Ρ‚Π΅ΠΌ β€” Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΏΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ Π² ΠΎΠ±ΠΎΠΈΡ… случаях символичСским ΠΈΠΌΠ΅Π½Π΅ΠΌ:

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdio.h>

#define BUFSZ 256

/* Π’ качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ имя

Β Β  символичСской связи */

main(int argc, char *argv[]) {

Β char buf[BUFSZ+1];

Β int nread, fd;

Β /* ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ содСрТимоС самой символичСской связи */

Β printf("Π§ΠΈΡ‚Π°Π΅ΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ связь\n");

Β nread = readlink(argv[1], buf, BUFSZ);