информационных технологий» 6 глава
9.2 Встроенные функции Функции округления: · mixed abs(mixed $number) Возвращает модуль числа. Тип параметра $number может быть float или int, а тип возвращаемого значения всегда совпадает с типом этого параметра. · double round(double $val) Округляет $val до ближайшего целого, например: $foo = round(3.4); // $foo == 3.0 $foo = round(3.5); // $foo == 4.0 · int ceil(float $number) Возвращает наименьшее целое число, не меньшее $number. · int floor(float $number) Возвращает максимальное целое число, не превосходящее $number. Случайные числа: · int mt_rand(int $min=0, int $max=RAND_MAX) Функция возвращает случайное число от 0 до RAND_MAX (эта константа задает максимально допустимое случайное число). Перед первым вызовом этой функции занужно пустить mt_srand(). · void mt_srand(int $seed) Настраивает генератор случайных чисел на новую последовательность. Числа, генерируемые mt_rand(), достаточно равновероятны, но у них есть недостаток: последовательность сгенерированных чисел будет одинакова если сценарий вызвать несколько раз подряд. Функция mt_srand() выбирает новую последовательность на основе параметра $seed, практически непредсказуемым образом. · int mt_getrandmax() Возвращает максимальное число, которое может быть сгенерировано функцией mt_rand(), т.е. константу RAND_MAX. Перевод в различные системы счисления · string base_convert(string $number, int $frombase, int $tobase) Переводит число $number (заданное как строка в системе счисления по основанию $frombase) в систему по основанию $tobase. Параметры $frombase и $tobase могут принимать значения только от 2 до 36 включительно. Пример:echo base_convert("FF",16,2); · int bindec(string $binary_string) Преобразует двоичное число, заданное в строке $binary_string, в десятичное число. · string decbin(int $number) Возвращает строку, представляющую собой двоичное представление целого числа $number. Максимальное число, которое может быть преобразовано, равно 2 147 483 647, (31 единичка в двоичной системе). Для восьмеричной и шестнадцатеричной систем существует такие же функции, называются они так же, только вместо "bin" подставляется соответственно "oct" и "hex".
Минимум и максимум: · mixed min(mixed $arg1 [int $arg2,..., int $argn]) Функция возвращает наименьшее из чисел, заданных в ее аргументах. Различают два способа вызова этой функции: с одним параметром или с несколькими. Если указан лишь один параметр (первый), то он обязательно должен быть массивом и возвращается минимальный элемент этого массива. В противном случае первый (и остальные) аргументы трактуются как числа с плавающей точкой, они сравниваются, и возвращается наименьшее. Тип возвращаемого значения выбирается так: если хотя бы одно из чисел, переданных на вход, задано в формате с плавающей точкой, то и результат будет с плавающей точкой, в противном случае результат будет целым числом. С помощью этой функции нельзя лексикографически сравнивать строки – только числа. · mixed max(mixed $arg1 [int $arg2,..., int $argn]) Функция ищет максимальное значение (аналогична min()). Степенные функции: · float sqrt(float $arg) Возвращает квадратный корень из аргумента. Если аргумент отрицателен, генерируется предупреждение. · float log(float $arg) Возвращает натуральный логарифм аргумента. В случае недопустимого числа печатает предупреждение, но не завершает программу. · float exp(float $arg) Возвращает e (2,718281828…) в степени $arg. · float pow(float $base, float $exp) Возвращает $base в степени $exp. Тригонометрия: · float acos(float $arg) // арккосинус · float asin(float $arg) // арксинус · float atan(float $arg) // арктангенс · float atan2(float $y, float $x) Возвращает арктангенс величины $y/$x, но с учетом той четверти, в которой лежит точка ($x, $y). Эта функция возвращает результат в радианах, принадлежащий отрезку от - ∞ до +∞. Пример: $alpha=atan2(1,1); // $alpha==pi/4 $alpha=atan2(-1,-1); // $alpha==-3*pi/4 · float sin(float arg) // синус
· float cos(float $arg) // косинус · float tan(float arg) // тангенс Для синуса, косинуса, тангенса аргумент задается в радианах. · double pi() // число p. Тема 10 Работа с файлами и каталогами, запуск внешних программ
10.1 Функции работы с файлами 10.2 Блокирование файла 10.3 Функции работы с каталогами 10.4 Запуск внешних программ
10.1 Функции работы с файлами При работе с файлами интерпретатору PHP все равно, какие слэши использовать: прямые или обратные. Он в любом случае переведет их в ту форму, которая требуется ОС, а функции по работе с полными именами файлов также не будут против «чужих» слэшей. Можно работать с файлами на удаленных серверах Web в точности так же, как и со своими собственными. Если имени файлу предшествует строка http:// или ftp://, то PHP понимает, что нужно установить сетевое соединение и работать именно с ним, а не с файлом. При этом в программе такой файл ничем не отличается от обычного. Текстовые и бинарные файлы. Во многих языках программирования для работы с текстовыми файлами применяется некоторый трюк. В Unix-системах для отделения одной строки файла от другой используется один специальный символ – его принято обозначать \n. Здесь \n обозначает именно один символ, т. е., один байт. Когда PHP встречает комбинацию \n в строке (например, «это \n тест»), он воспринимает ее как один байт. В то же время, в строке, заключенной в апострофы, комбинация \n не имеет никакого специального назначения и обозначает буквально «символ \, за которым идет символ n». В Windows для разделения строк применяется не один, а два символа, следующих подряд, – \r\n. Для того чтобы языки программирования были лучше переносимы с одной операционной системы на другую, при чтении текстовых файлов комбинация \r\n преобразуется «на лету» в один символ \n, так что программа и не замечает, что формат файла не такой, как в Unix. Поэтому, если например, прочитать содержимое всего текстового файла в строку, то длина такой строки окажется меньше физического размера файла – ведь из нее «съелись» некоторые символы \r. Это относится к системе Windows. При записи строки в текстовый файл происходит в точности наоборот: один \n становится на диске парой \r\n. Практически во всех языках программирования можно отключить режим автоматической трансляции \r\n в один \n. Обычно для этого используется вызов специальной функции, который говорит, что для указанного файла нужно применять бинарный режим ввода/вывода, когда все байты читаются, как есть.
Так как PHP был написан целиком на Си, а Си использует трансляцию символов перевода строк, то описанная техника работает и в PHP. Однако есть один очень опасный момент. Интерпретатор может работать с файлами в режиме трансляции символа перевода строки. Если файл открыт в режиме бинарного чтения/записи, то PHP все равно, что читается или пишется. Можно считать содержимое бинарного файла (например, GIF-рисунка) в обычную строковую переменную, а потом записать эту строку в другой файл, и при этом информация нисколько не исказится. При чтении текстового файла в Windows получите символы \r\n в конце строки вместо одного \n. Открытие файла. Работа с файлами в PHP разделяется на три этапа. Сначала файл открывается в нужном режиме, при этом возвращается целое число, служащее идентификатором открытого файла (дескриптор файла). Затем используются команды работы с файлом (чтение или запись, или и то и другое), причем они «привязаны» уже к дескриптору файла, а не к его имени. После этого файл лучше всего закрыть (хотя это можно и не делать, поскольку PHP автоматически закрывает все файлы по завершении сценария). · int fopen (string $filename, string $mode, bool $use_include_path=false) Функиця открывает файл с именем $filename в режиме $mode и возвращает дескриптор открытого файла. В случае ошибки функция возвращает false. Дескриптор 0 в системе соответствует стандартному потоку ввода, он никогда не будет открыт функцией fopen() (во всяком случае, пока не будет закрыт нулевой дескриптор). Необязательный параметр $use_include_path говорит PHP о том, что, если задано относительное имя файла, его следует искать также и в списке путей, используемом инструкциями include и require. Обычно этот параметр не используют. Параметр $mode может принимать следующие значения: r – файл открывается только для чтения. Если файла не существует, вызов регистрирует ошибку. После удачного открытия указатель файла устанавливается на его первый байт, т. е. на начало;
r+ – файл открывается одновременно на чтение и запись. Указатель текущей позиции устанавливается на его первый байт. Если файла не существует, возвращается false. Если в момент записи указатель файла установлен где-то в середине файла, то данные запишутся прямо поверх уже имеющихся, а не «раздвинут» их, при необходимости увеличив размер файла. w – создает новый пустой файл. Если на момент вызова уже был файл с таким именем, то он предварительно уничтожается. w+ – аналогичен r+, но если файла не существовало, создает его. После этого с файлом можно работать как в режиме чтения, так и записи. Если файл существовал до момента вызова, его содержимое удаляется; a – открывает существующий файл в режиме записи, и при этом сдвигает указатель текущей позиции за последний байт файла. Этот режим используется для дополнения файла. a+ – открывает файл в режиме чтения и записи, указатель файла устанавливается на конец файла, при этом содержимое файла не уничтожается. Отличается от a тем, что если файла изначально не существовало, то он создается. Этот режим полезен, если нужно что-то дописать в файл, но неизвестно, создан ли уже такой файл; В конце любой из строк r, w, a, r+, w+ и a+ может находиться еще один необязательный символ – b или t. Если указан b (или не указан вообще никакой), то файл открывается в режиме бинарного чтения/записи. Если же это t, то для файла устанавливается режим трансляции символа перевода строки, т. е. он воспринимается как текстовый. Пример работы с текстовыми файлами: <? // Получает в параметрах строку и возвращает через пробел коды // символов, из которых она состоит function MakeHex($st) { for($i=0; $i<strlen($st); $i++) $Hex[]=sprintf("%2X",ord($st[$i])); return join(" ",$Hex); } // Открываем файл разными способами $f=fopen("test.php","r"); // бинарный режим echo MakeHex(fgets($f,100)),"<br>\n"; $f=fopen("test.php","rt"); // текстовый режим echo MakeHex(fgets($f,100)),"<br>\n"; ?> Первая строчка файла test.php состоит всего из двух символов – это < и?. За ними должен следовать маркер конца строки. Сценарий показывает, как выглядит этот маркер, т. е. состоит ли он из одного или двух символов. Результат работы сценария: 3C 3F 0D 0A 3C 3F 0A Бинарное и текстовое чтение дали разные результаты! В последнем случае произошла трансляция маркера конца строки. Можно предварять имя файла строкой http:// или ftp://, при этом будет осуществляться доступ к файлу с удаленного хоста. В случае HTTP-доступа PHP открывает соединение с указанным сервером, а также посылает ему нужные заголовки: Host и GET. После чего при помощи файлового дескриптора из удаленного файла можно читать обычным образом, например с помощью функции fgets().
Если открывается FTP-файл, то в него можно производить либо запись, либо читать из него, но не и то и другое одновременно. Кроме того, лучше не использовать обратные слэши \ в именах файлов. При использовании обратного слэша нужно его удвоить, потому что в строках он воспринимается как спецсимвол: $fp = fopen ("c:\\windows\\hosts", "r"); Этот способ не переносим между операционными системами. Лучше не использовать его! Примеры: // Открывает файл на чтение $f=fopen("/home/file.txt","r")or die("Ошибка!"); // Открывает HTTP-соединение на чтение $f=fopen("http://www.php/","r") or die("Ошибка!"); // Открывает FTP-соединение с указанием логина и пароля для записи $f = fopen("ftp://user:password@example.com/", "w") or die("Ошибка!"); Конструкция or die(). Эта конструкция применяется при работе с файлами. Оператор or имеет очень низкий приоритет (даже ниже, чем у =), поэтому всегда выполняется уже после присваивания. Если файл открыть не удалось, fopen() возвращает false, а значит, осуществляется вызов функции die(). Нельзя просто заменить or на, казалось бы равнозначный ему оператор ||, потому что последний имеет гораздо более высокий приоритет – выше, чем у =. Таким образом, в результате вызова функции $f=fopen("/home/file.txt", "r") || die("Ошибка!"); в действительности будет выполнено $f=(fopen("/home/file.txt","r") || die("Ошибка!")); Это не совсем то, что нам нужно. Безымянные временные файлы. Иногда приходится работать с временными файлами, которые при завершении программы хотелось бы удалить. При нужно знать лишь файловый дескриптор, а не имя временного файла. Для создания таких объектов в PHP предусмотрена специальная функция. · int tmpfile() Создает новый файл с уникальным именем и открывает его на чтение и запись. В дальнейшем вся работа должна вестись с возвращенным файловым дескриптором, потому что имя файла недоступно. Пространство, занимаемое временным файлом, автоматически освобождается при его закрытии и при завершении работы программы. Закрытие файла. После работы файл лучше всего закрыть (несмотря на то, что PHP сам закрывает все файлы по завершении работы сценария). Для этого используется следующая функция: · int fclose(int $fp) Функция закрывает файл и возвращает false, если файл закрыть не удалось. В противном случае возвращает значение «истина». Необходимо всегда закрывать FTP- и HTTP-соединения, потому что в противном случае «беспризорный» файл приведет к неоправданному простою канала и излишней загрузке сервера. Кроме того, успешно закрыв соединение, можно быть уверены в том, что все данные были доставлены без ошибок. Особенно своевременное закрытие критично при использовании FTP-файла в режиме записи, когда вывод программы для ускорения буферизуется. Не закрыв файл, вообще нельзя быть увереным, что буфер вывода очистился, а значит, файл записался на удаленную машину верно. Чтение и запись. Для каждого открытого файла (точнее, для каждого файлового дескриптора, ведь один и тот же файл может быть открыт несколько раз, т. е. с ним может быть связано сразу несколько дескрипторов) система хранит определенную величину, которая называется текущей позицией ввода-вывода, или указатель файла. Функции чтения и записи файлов работают именно с этой позицией. А именно, функции чтения читают блок данных, начиная с этой позиции, а функции записи – записывают, также отсчитывая от нее. Если указатель файла установлен за последним байтом и осуществляется запись, то файл автоматически увеличивается в размере. После того как файл успешно открыт, из него (при помощи дескриптора файла) можно читать, а также, при соответствующем режиме открытия, писать. Обмен данными осуществляется через строки, начиная с позиции указателя файла. Блочные чтение/запись. · string fread(int $f, int $numbytes) Читает из файла $f $numbytes символов и возвращает строку этих символов. После чтения указатель файла продвигается к следующим после прочитанного блока позициям. Если $numbytes больше, чем можно прочитать из файла (например, раньше достигается конец файла), возвращается то, что удалось считать. Этот прием можно использовать, если нужно считать в строку файл целиком. Для этого нужно задайть в $numbytes очень большое число (например, сто тысяч). Но нужно заботиться об экономии памяти в системе, так поступать не рекомендуется, потому что в некоторых версиях PHP передача большой длины строки во втором параметре fread() вызывает первоначальное выделение этой памяти в соответствии с запросом (даже если строка гораздо короче). Конечно, потом лишняя память освобождается, но все же ее может и не хватить для начального выделения. · int fwrite(int $f, string $st) Записывает в файл $f все содержимое строки $st. При работе с текстовыми файлами все \n автоматически преобразуются в тот разделитель строк, который принят в операционной системе. Построчные чтение/запись. · string fgets(int $f, int $length) Читает из файла одну строку, заканчивающуюся символом новой строки \n. Этот символ также считывается и включается в результат. Если строка в файле занимает больше $length-1 байтов, то возвращаются только ее $length-1 символов. · int fputs(int $f, string $st) Эта функция – полный аналог fwrite(). Чтение CSV-файла. · list fgetcsv(int $f, int $length, char $delim=’,’) Функция читает одну строку из файла Excel, записанного в формате csv, заданного дескриптором $f, и разбивает ее по символу $delim. Параметр $delim должен быть строкой из одного символа, в противном случае принимается во внимание только первый символ этой строки. Функция возвращает получившийся список или false, если строки кончились. Параметр $length задает максимальную длину строки точно так же. Пустые строки в файле не игнорируются, а возвращаются как список из одного элемента – пустой строки. Пример использования функции: $f=fopen("file.csv","r") or die("Ошибка!"); for($i=0; $data=fgetcsv($f, 1000, ";"); $i++) { $num = count($data); if($num==1 && $data[0]==="") continue; echo "<h3>Строка номер $i ($num полей):</h3>"; for($c=0; $c<$num; $c++) print "[$c]: $data[$c]<br>"; } fclose($f); Положение указателя текущей позиции. · int feof(int $f) Функция возвращает true, если достигнут конец файла. Эта функция чаще всего используется в следующем контексте: $f=fopen(: "myfile.txt","r"); while(!feof($f)) { $st=fgets($f); // обрабатываем очередную строку $st //... } fclose($f); Лучше избегать подобных конструкций, т. к. в случае больших файлов они довольно медлительны. Лучше читать файл целиком при помощи File() или fread(), если нужен доступ к каждой строке этого файла, а не только к нескольким первым! · int fseek(int $f, in $offset, int $whence=SEEK_SET) Устанавливает указатель файла на байт со смещением $offset (от начала файла, от его конца или от текущей позиции, в зависимости от параметра $whence). Эта функция может не сработать, если дескриптор $f ассоциирован не с обычным локальным файлом, а с соединением HTTP или FTP. Параметр $whence задает, с какого места отсчитывается смещение $offset. В PHP для этого существуют три константы, равные, соответственно, 0, 1 и 2: SEEK_SET – устанавливает позицию начиная с начала файла; SEEK_CUR – отсчитывает позицию относительно текущей позиции; SEEK_END – отсчитывает позицию относительно конца файла. В случае использования последних двух констант параметр $offset может быть отрицательным (а при применении SEEK_END он будет отрицательным наверняка). В случае успешного завершения функция возвращает 0, а в случае неудачи - 1. · int ftell(int $f) Возвращает положение указателя файла. Функции для определения типов файлов. PHP имеет набор вспомогательных функций для работы с файлами. Они отличаются тем, что работают не с файловыми идентификаторами, а непосредственно с их именами. Определение типа файла · bool file_exists(string $filename) Возвращает true, если файл с именем $filename существует на момент вызова. · string filetype(string $filename) Возвращает строку, которая описывает тип файла с именем $filename. Если такого файла не существует, возвращает false. После вызова строка будет содержать одно из следующих значений: file – обычный файл; dir – каталог; link – символическая ссылка; fifo – fifo-канал; block – блочно-ориентированное устройство; char – символьно-ориентированное устройство; unknown – неизвестный тип файла. · bool is_file(string $filename) Возвращает true, если $filename – обычный файл. · bool is_dir(string $filename) Возвращает true, если $filename – каталог. · bool is_link(string $filename) Возвращает true, если $filename – символическая ссылка. Определение возможности доступа. · bool is_readable(string $filename) Возвращает true, если файл может быть открыт для чтения. · bool is_writeable(string $filename) Возвращает true, если в файл можно писать. · bool is_executable(string $filename) Возвращает true, если файл – исполняемый. Определение параметров файла. · array stat(string $filename) Функция собирает вместе всю информацию, выдаваемую операционной системой для указанного файла, и возвращает ее в виде массива. Этот массив всегда содержит следующие элементы с указанными ключами: 0 – устройство; 1 – номер узла inode; 2 – атрибуты защиты файла; 3 – число синонимов («жестких» ссылок) файла; 4 – идентификатор uid владельца; 5 – идентификатор gid группы; 6 – тип устройства; 7 – размер файла в байтах; 8 – время последнего доступа в секундах, прошедших с 1 января 1970 года; 9 – время последней модификации содержимого файла; 10 – время последнего изменения атрибутов файла; 11 – размер блока; 12 – число занятых блоков. Специализированные функции. Для того чтобы каждый раз не возиться с вызовом stat() и разбором выданного массива, разработчики PHP предусмотрели несколько простых функций, которые сразу возвращают какой-то один параметр файла. Кроме того, если объекта (обычно файла), для которого вызвана какая-либо из ниже перечисленных функций, не существует, эта функция возвратит false. · int fileatime(string $filename) Возвращает время последнего доступа к файлу. Время выражается в количестве секунд, прошедших с 1 января 1970 года. Если файл не обнаружен, возвращает false. · int filemtime(string $filename) Возвращает время последнего изменения файла или false в случае отсутствия файла. · int filectime(string $filename) Возвращает время создания файла. · int filesize(string $filename) Возвращает размер файла в байтах или false, если файла не существует. · int touch(string $filename [, int $timestamp]) Устанавливает время модификации указанного файла $filename равным $timestamp (в секундах, прошедших с 1 января 1970 года). Если второй параметр не указан, то подразумевается текущее время. В случае ошибки возвращается false. Функции для работы с именами файлов: · string basename(string $path) Выделяет основное имя файла из пути $path. Примеры: echo basename("/home/somebody/somefile.txt"); // выводит "somefile.txt" echo basename("/"); // ничего не выводит echo basename("/."); // выводит "." echo basename("/./"); // также выводит "." Функция basename() (и все последующие) не проверяет существование файла. Она берет часть строки после самого правого слэша и возвращает ее. Функция basename() правильно обрабатывает как прямые, так и обратные слэши. · string dirname(string $path) Возвращает имя каталога, выделенное из пути $path. Функция умеет обрабатывать нетривиальные ситуации: echo dirname("/home/file.txt"); // выводит "/home" echo dirname("../file.txt"); // выводит ".." echo dirname("/file.txt"); // выводит "/" под Unix, "\" под Windows echo dirname("/"); // то же самое echo dirname("file.txt"); // выводит "." Если функции dirname() передать «чистое» имя файла, она вернет ".", что означает «текущий каталог». · string tempnam(string $dir, string $prefix) Генерирует имя файла в каталоге $dir с префиксом $prefix в имени, причем так, чтобы созданный под этим именем в будущем файл был уникален. Для этого к строке $prefix присоединяется некое случайное число. Например, вызов tempnam("/tmp","temp") может возвратить что-то типа /tmp/temp3a6b243c. Если такое имя нужно создать в текущем каталоге, нужно передать $dir=".". · string realpath(string $path) Функция преобразовает относительный путь в $path в абсолютный, т. е. начинающийся от корня. Например: echo realpath("../t.php"); // абсолютный путь – например, /home/test.php echo realpath("."); // выводит имя текущего каталога Файл, который указывается в параметре $path, должен существовать, иначе функция возвращает false. Функции манипулирования целыми файлами: · bool copy(string $src, string $dst) Копирует файл с именем $src в файл с именем $dst. Если файл $dst на момент вызова существовал, осуществляется его перезапись. Функция возвращает true, если копирование прошло успешно, а в случае провала – false. · bool rename(string $oldname, string $newname) Переименовывает (или перемещает) файл с именем $oldname в файл с именем $newname. Если файл $newname уже существует, функция возвращает false. В случве успеха, возвращается true. · bool unlink(string $filename) Удаляет файл с именем $filename. В случае неудачи возвращает false, иначе – true. · list File(string $filename) Считывает файл с именем $filename целиком и возвращает массив-список, каждый элемент которого соответствует строке в прочитанном файле. Функция работает очень быстро – гораздо быстрее использование fopen() и чтение файла по одной строке. Неудобство этой функции состоит в том, что символы конца строки (обычно \n), не вырезаются из строк файла, а также не транслируются, как это делается для текстовых файлов. · array get_meta_tags(string $filename, int $use_include_path=false); Функция открывает файл и ищет в нем все тэги <meta> до тех пор, пока не встретится закрывающий тэг </head>. Если очередной тэг <meta> имеет вид: <meta name="название" content="содержимое"> то пара название=>содержимое добавляется в результирующий массив, который под и возвращается. Функцию удобно использовать для быстрого получения всех метатегов из указанного файла. Если необязательный параметр $use_include_path установлен, то поиск файла осуществляется не только в текущем каталоге, но и во всех тех, которые назначены для поиска инструкциями include и require. Другие функции: · bool ftruncate(int $f, int $newsize) Функция усекает открытый файл $f до размера $newsize. Файл должен быть открыт в режиме, разрешающем запись. Пример: ftruncate($f,0); // очистить содержимое файла · void fflush(int $f) Функция заставляет PHP немедленно записать на диск все изменения, которые производились до этого с открытым файлом $f. Для повышения производительности все операции записи в файл буферизируются: например, вызов fputs($f,"Это строка!") не приводит к непосредственной записи данных на диск – сначала они попадают во внутренний буфер (обычно размером 8K). Как только буфер заполняется, его содержимое отправляется на диск, а сам он очищается, и все повторяется вновь. Особенный выигрыш от буферизации чувствуется в сетевых операциях, когда просто глупо отправлять данные маленькими порциями. Функция fflush() вызывается неявно и при закрытии файла. · int set_file_buffer(int $f, int $size) Функция устанавливает размер буфера для указанного открытого файла $f. Чаще всего она используется так: set_file_buffer($f,0); Приведенный код отключает буферизацию для указанного файла, так что теперь все данные, записываемые в файл, немедленно отправляются на диск или в сеть. 10.2 Блокирование файла При интенсивном обмене данными с файлами в мультизадачных операционных системах встает вопрос синхронизации операций чтения/записи между процессами. Например, пусть есть несколько «процессов-писателей» и один «процесс-читатель». Необходимо, чтобы в единицу времени к файлу имел доступ лишь один процесс-писатель, а остальные на этот момент времени как бы «подвисали», ожидая своей очереди. Это нужно, например, чтобы данные от нескольких процессов не перемешивались в файле, а следовали блок за блоком. Для этого используется функция flock(), которая устанавливает так называемую «рекомендательную блокировку» для файла. Это означает, что блокирование доступа осуществляется не на уровне ядра системы, а на уровне программы.
Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|