CodeNet / Языки программирования / C / C++ / Linux/Unix / Справочник С/C++ для UNIX - Список функций
CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник С/C++ для UNIX - Список функций
CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник С/C++ для UNIX - Список функций
locking
LOCKING #include <sys\locking.h> #include <io.h> требуется только для объявления функции int locking(handle,mode,nbyte); int handle; файловый handle int mode; режим блокировки файла int nbyte; число блокированных байтов Описание. Функция locking блокирует или разблокирует байты nbytes файла, определенного по handle. Блокировка байтов в файле не раз- решает последующего чтения и записи этих байтов другими процесса- ми. Разблокировка файла разрешает другим процессам читать или за- писывать в байты, заблокированные ранее. Блокирование или разбло- кирование начинается с текущей позиции указателя на файл и расп- ространяется до следующих nbyte байтов или до конца файла. Аргумент mode определяет выполняемые действия блокировки. Он может быть одной из следующих manifest-констант. Мanifest-константа Значение LK_LOCK Блокировка заданных байтов. Если байты не заблокировались, происходит повторная попытка блокировки через 1 секунду. Если после 10 попыток байты не заблокировались, возвращается ошибка. LK_RLCK Аналогично LK_LOCK. LK_NBLCK Блокировка заданных байтов. Если байты не заблокированы, возвращается ошибка. LK_NRLCK Аналогично LK_NBLCK. LK_UNLCK Разблокировка заданных байтов. Байты должны быть ранее заблокированы. Для файла может быть заблокирована более чем одна область, но работа с перектытыми областями не допускается. Кроме того, в одно и то же время не может быть разблокирована более чем одна область. Когда файл разблокируется, область разблокируемого файла должна соответствовать ранее заблокированной области. Функция locking не может разблокировать одновременно смежные области, так как если две области являются смежными, каждая область должна быть разблокирована отдельно. Все блокировки должны быть удалены перед закрытием файла или перед выходом из программы. Возвращаемое значение. Функция locking возвращает 0, если она успешно выполнилась. Возвращаемое значение -1 свидетельствует о неудаче и errno уста- навливается в одно из следующих значений: Значение Его смысл EACCES принудительная блокировка (файл всегда блокирован или разблокирован). EBADF неверный файловый handle. EDEADLOCK принудительная блокировка. Это значение возвращается, если задан фллаг LK_LOCK или LK_RLCK, и файл не может быть заблокирован после 10 попыток. См.также open, creat. Замечание! Функция locking может быть использована только для версий MS DOS 3.0 и последующих, в ранних версиях MS DOS она не дает никакого результата. Пример: #include <io.h> #include <sys\locking.h> #include <stdlib.h> extern unsigned char _osmajor; int fh; long pos; . . . /* сохранить текущую позицию указателя на файл, затем бло- кировать область от начала файла до сохраненной позиции указателя на файл */ if (_osmajor >= 3) { pos=tell(fh); lseek(fh, OL, O); if ((locking(fh, LK_NBLCK,pos)) != -1) { . . . lseek(fh, OL, O); locking((fh, LK_UNLCK, pos); } } LOG-LOG10 #include <math.h> double log(x); вычисляет натуральный логарифм x. double log10(x); вычисляет десятичный логарифм x. double x; значение с плавающей точкой. Описание. Функции log и log10 вычисляют соответственно натуральный и десятичный логарифм x. Возвращаемое значение. Функции log и log10 возвращают результат логарифма. Если x отрицательное значение, обе функции печатают сообщение об ошибке DOMAIN в stderr и возвращают отрицательное значение HUGE. Если x равно 0, обе функции печатают сообщение об ошибке SING и возвра- щают отрицательное значение HUGE. И в том и в другом случае errno устанавливается в EDOM. Обработка ошибок может быть модифицирована при изменении процедуры matherr. См.также exp, matherr, pow. Пример: #include <math.h> double xx = 1000.0, y; y = log(x); /* y = 6.907755 */ /* функция log10 вычисляет десятичный логарифм для заданно- го значения */ y = log10(x); /* y = 3.0 */ LONGJMP. #include <setjmp.h> void longjmp(env, value); jmp_buf env; переменная, в которой хранится окружение int value; значение, возвращаемое при вызове setjmp. Описание. Функция longjmp восстанавливает состояние стека, ранее сох- раненное в env функцией setjmp. Функции setjmp и longjmp обеспечивают возможность выполне- ния нелокального (nonlocal) перехода и обычно используются для передачи управления на выполнение обработки ошибок; восстанавли- вают код в ранее вызванной процедуре (без использования обычного вызова); возвращают условные обозначения. Вызовом setjmp сохраняется текущее состояние стека в env. Последующий вызов longjmp восстанавливает сохраненное состояние и возвращает управление на указатель (точку входа), непосредственно следующий за соответствующим вызовом setjmp. Выполнение возобновляется, когда вызов setjmp возвращает заданное value. Когда вызывается longjmp, значения всех перемен- ных (за исключением переменных регистра) становятся доступными для процедуры, которая принимает управление и содержит значения этих переменных. Значения переменных регистра непредсказуемы. Функция longjmp должна вызываться ранее функции, определяю- щей возврат setjmp. Если longjmp вызвана после функции, определя- ющей возврат setjmp, то может произойти непредсказуемое поведение программы. Значение value, возвращаемое longjmp, должно быть ненуле- вым. Если для value задан аргумент 0, значение возврата заменяет- ся значением 1. Возвращаемое значение. Возвращаемого значения нет. См. также setjmp. Предупреждение! Значения переменных регистра в процедуре, вызывающей setjmp, после выполнения longjmp не могут быть восста- новлены к собственным значениям. Пример: #include <stdio.h> #include <setjmp.h> jmp_buf mark; main() { if (setjmp(mark) != 0) { printf("longjmp has been called\n"); recover(); exit(1); } printf("setjmp has been called\n"); . . . p(); . . . } p() { int error = 0; . . . if (error != 0) longjmp(mark, -1); . . . } recover() { /* при выходе из программы убедитесь, что файлы данных не будут запорчены */ . . . }.