| |
так же,
как это делается в функции 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(), котор
|
|