Шрифт:
Таблица 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);
if (nread < 0) {
perror("readlink");
exit(1);
}
/* readlink не завершает строку '\0' */
printf("Символическая связь:\n %s\n", buf);
/* Теперь прочитаем содержимое целевого файла */
printf("Читаем целевой файл\n");
fd = open(argv[1], O_RDONLY);
if (fd < 0) {
perror("open");
exit(2);
}
nread = read(fd, buf, BUFSIZ);
if (nread < 0) {
perror("read");
exit(3);
}
buf[nread] = '\0';
printf("Целевой файл:\n %s\n", buf);
close(fd);
exit(0);
}
Перед тем как запустить программу, создадим символическую связь с файлом unix0.txt:
$ ln -s unix0.txt symlink.txt
$ ls -l
lrwxrwxrwx 1 andy user 10 Jan 6 09:54 symlink.txt -> unix0.txt
– rw-r--r-- 1 andy user 498 Jan 6 09:53 unix0.txt
$ a.out symlink.txt
Читаем символическую связь