Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
так же,
 
как это делается в функции fopen(). 
Хочу обратить ваше внимание на то, что канал нельзя открыть в режиме одно- 
временного чтения и записи. Что послужило этому причиной? Ответ на по- 
ставленный вопрос в деталях занял бы слишком много места, чтобы помес- 
титься в этой книге, но в двух словах можно сказать так: из-за буферизации 
ввода-вывода реально возникновение ситуации, когда процесс-родитель будет 
находиться в режиме ожидания данных от запущенного сына, а сын — будет 
ждать данные от родителя. Таким образом, возникает состояние взаимной 
блокировки: оба процесса оказываются приостановлены. В общем случае эта 
проблема неразрешима, если у нас нет полного контроля над кодом процесса- 
сына. 
Далее в нашем примере происходит вот что. Стандартный вывод утилиты (тот, кото- 

рый по умолчанию всегда является просто выводом на экран — да простят меня по- 
клонники Unix, но все-таки так будет проще объяснить, не разъясняя, что такое 
пере- 
направление ввода-вывода и какую роль оно играет в этой ОС) прикрепляется к 
идентификатору $fp. Теперь все, что печатает утилита (а в нашем случае она 
печата- 
ет содержимое каталога), может быть прочитано при помощи обычных вызовов фай- 
ловых функций чтения — fgets(), fread() и т. д. 
Программа ls не ждет никакого ввода (однако в общем случае это далеко не всегда 
так), 
вот почему мы пользуемся только серией вызовов fgets(). После того, как "дело 
сдела- 
но", канал $fp, вообще говоря, нужно закрыть. Если он ранее был открыт в режиме 
запи- 
си, утилите "на том конце" передается, что ввод данных "с клавиатуры" завершен, 
и она 
может закончить свою работу. 
В PHP не существует функций, которые могли бы открывать канал к дочернему 
процессу в режиме чтения и записи. 

Глава 17. Каналы и символические ссылки 275 
Теперь, когда мы разобрались с каналами, давайте посмотрим, что предлагает нам 
PHP для работы с символическими ссылками. 
Символические ссылки 
Для начала (для тех, кто не знает) — что это такое? В системе Unix (да и в 
других ОС 
в общем-то тоже) довольно часто возникает необходимость иметь для одного и того 

же файла или каталога разные имена. При этом логично одно из имен назвать 
основ- 
ным, а все другие — его псевдонимами. В терминологии Unix такие псевдонимы на- 
зываются символическими ссылками. 
Символическая ссылка — это просто бинарный файл специального вида, который 
содержит ссылку на основной файл. При обращении к такому файлу (например, от- 
крытию его на чтение) система "соображает", к какому объекту на самом деле 
запра- 
шивается доступ, и "прозрачно его обеспечивает. Это означает, что мы можем ис- 
пользовать символические ссылки точно так же, как и обычные файлы (в частности, 

работают fopen(), fread() 
и т. д.) Однако иногда нужно бывает работать со ссылкой именно как со ссылкой 
(простите за тавтологию), а не как с файлом. Для этого и существуют 
перечисленные 
ниже функции PHP. 
string readlink(string $linkname) 
Возвращает имя основного файла, с которым связан его синоним $linkname. Это 
бывает полезно, если вы хотите узнать основное имя файла, чтобы, например, уда- 

лить сам файл, а не ссылку на него. В случае ошибки функция возвращает значение 

"ложь". 
bool symlink(string $target, string $link) 
Эта функция создает символическую ссылку с именем $link на объект (файл или 
каталог), заданную в $target. В случае "провала" функция возвращает false. 
array lstat(string $filename) 
Функция полностью аналогична вызову stat(), за исключением того, что если 
$filename задает не файл, а символическую ссылку, будет возвращена информация 
именно об этой ссылке (а не о файле, на который она указывает, как это делает 
stat()). 
int linkinfo(string $linkname) 
Функция возвращает значение поля "устройство" из результата, выдаваемого 
функци- 
ей lstat(), котор
 
<<-[Весь Текст]
Страница: из 287
 <<-