ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 1

                                      - 54 -
               
            
                
                    ЧАСТЬ 2.  ОПИСАНИЕ  ФУНКЦИЙ  БИБЛИОТЕКИ  СИ
         
               
               ABORT
            
            #include   требуется только для объявления
                                  функции
            #include    использует  либо  ,
                                  либо 
            void abort();
         
               Описание.
               
               Функция  abort  распечатывает  сообщение  "Abnormal program
         termination" (аварийное (непредвиденное) завершение программы)  в
         stderr,  затем оканчивает вызванный процесс, возвращая управление
         процессу, который инициировал вызванный процесс (обычно  операци-
         онной системе). Функция abort не обновляет буферы потоков.
            
               Возвращаемое значение.
            
               Возвращается статус выхода 3 к parent-процессу  либо к опе-
         рационной системе.
               См.также  execl,  execle,  execip,  execlpe, execv, execve,
         execvp, execvpe, exit, _exit, signal, spawnl,  spawnle,  spawnlp,
         spawnlpe, spawnv, spawnve, spawnvp, spawnvpe.
            
               Пример:
            
            #include 
            
            main(args, argv)
            int argc;
            char *argv[];
            {
            FILE *stream;
            if ((stream=fopen(argv[argc-1],"r"))==NULL) {
               frpintf(stderr,
                       "%s couldn't open file %s\n", argv[0],
                       argv[argc-1]);
               abort();
               }
            
               /*  Замечание.  Имя программы хранится в argv[0] только для
         версии MS DOS 3.0 и старших; в ранних  версиях  argv[0]  содержит
         строку "С". */
            
               }
      
               Образец командной строки:
            
               update employ.dat
            
               На выходе:

                                      - 55 -
         
         
            
            C:\BIN\UPDATE.EXE  couldn't open file employ.dat.
            
               Abnormal program termination.
               (Непредвиденное завершение программы).
                
               ABS
            
            #include           требуется   только    для
                                         объявления функции
            int abs(n);
            int n;                       целое значение
            
               Описание.
            
               Функция  abs  возвращает  абсолютное значение своего целого
         аргумента n.
            
               Возвращаемое значение.
            
               Функция abs возвращает абсолютное значение своего  аргумен-
         та. Возвращаемого значения в случае ошибки нет.
               См. также cabs, fabs, labs.
            
               Пример:
            
            #include 
            
            int x = -4, y;
            
            y = abs(x);
            printf("%d\t%d\n", x, y);.
            
               На выходе:
            
            -4       4.

      
               ACCESS
            
            #include           требуется только для объявления
                                     функции
            
            int access(pathname, mode);
            char *pathname;          path-имя файла или директория
            int mode;                разрешенный доступ
                
               Описание.
            
               Для  файлов  функция  access определяет, существует или нет
         определенный файл, может ли он быть доступен  в  заданном  режиме
         mode.  Возможные  значения mode и их обозначения в вызовах access
         приведены ниже.
            

                                      - 56 -
         
         
            ЗНАЧЕНИЕ             СМЫСЛ ЗНАЧЕНИЯ
                           
                06         Проверка   на  доступ  по  чтению   и
                           записи
                           
                04         Проверка   на  доступ  по  чтения
                           
                02         Проверка   на  доступ  по  записи
                           
                00         Проверка   только на существование

            
               В MS DOS все существующие файлы имеют доступ по чтению, по-
         этому режимы 00 и 04 вырабатывают один и тот же результат. Анало-
         гично, режимы 06 и 02 являются эквивалентными, поскольку в MS DOS
         доступ по записи предполагает доступ по чтению.
               Для директориев access определяет, существуют или  нет  за-
         данные  директории;  под  управлением MS DOS все директории имеют
         доступ по чтению и записи.
            
               Возвращаемое значение.
            
               Функция access возвращает значение 0, если файл  имеет  за-
         данный  режим  mode.  Возвращаемое  значение -1 свидетельствует о
         том, что названный файл не существует или недоступен  в  заданном
         mode, и errno устанавливается в одно из следующих значений:
            
           ЗНАЧЕНИЕ                  СМЫСЛ ЗНАЧЕНИЯ
                           
            EACCES               Доступ  запрещен; установленный  статус
                                 для  файла  не допускает заданного  до-
                                 ступа
                           
            ENOENT               Файл или path-имя не найдено

            
               См.также chmod, fstat, open, stat.
            
               Пример:
            
            #include 
            #include 
            
            int fh;
            .
            .
            .
            /* проверка доступа по записи */
            if ((access("data",2))==-1 {
                   perror("data file not writable");
                   exit(1);
                   }
                
            else
                   fh=open("data", O_WRONLY);
            

                                      - 57 -
         
         
      
               ACOS
                              
            #include 
            
            double acos(x);
            double x;
            
               Описание.
            
               Функция acos возврaщaет aрккосинус x в интервaле от 0 до n.
         Знaчение x должно быть между -1 и 1.
            
               Возврaщaемое знaчение.
            
               Функция acos возврaщaет результaт aрккосинусa. Если x мень-
         ше -1 или больше 1, acos устaнaвливaет errno в EDOM, печaтaет со-
         общение об ошибке DOMAIN в stderr и возврaщaет 0.
               Обрaботкa ошибок может быть  модифицировaнa  при  изменении
         процедуры matherr.
               См.тaкже asin, atan, atan2, cos, matherr, sin, tan.
            
               Пример:
            
               В следующем примере прогрaммa выдaет подскaзки для вводa до
         тех пор, покa введенное знaчение не будет в интервaле от -1 до 1.
            
            #include 
            
            int errno;
            
            main()
                {
                float x,y;
            
                for (errno=EDOM;errno==EDOM;y=acos(x)) {
                    printf("Cosine=");
                    scanf("%f",&x);
                    errno = 0;
                    }
                printf("Arc cosine of %f = %f\n",x,y);
                }
            
            Обрaзец выводa:
            
            Cosine = 3
            acos: DOMAIN error
            Cosine = -1.0
            Arc cosine of -1.000000 = 3.141593
            
      
               ALLOCA
            
            #include     требуется только для объявления
                                   функции

                                      - 58 -
         
         
            
            char *alloca(size);
            unsigned size;         захваченные байты из стека
            
               Описание.
            
               Процедура alloca захватывает байты size из стека программы.
         Захваченное  пространство  автоматически освобождается при выходе
         из функции, вызвавшей alloca.
            
               Возвращаемое значение.
            
               Процедура alloca возвращает указатель char  на  захваченное
         пространство.
               В  памяти,  на которую указывает возвращаемое значение, га-
         рантировано выравнивание для хранения любого типа объекта.  Чтобы
         получить  указатель на тип, отличный от char, используется преоб-
         разователь типа  возвращаемого  значения.  Возвращается  значение
         NULL, если пространство не было захвачено.
               См.также calloc, malloc, realloc.
            
               Предупреждение.  Значение указателя, возвращаемого процеду-
         рой alloca, не может быть аргументом для free. Так как alloca об-
         рабатывает стек, она должна использоваться только в простых  опе-
         раторах  выделения  и не должна использоваться в выражениях-аргу-
         ментах функций.
            
               Пример:
                      
            #include 
            int *intarray;
            
            /* захватывает память в стеке для 10 целых */
            
            intarray=(int*)alloca(10*sizeof(int));

      
               ASCTIME
            
            #include 
            
            char *asctime(time);
            struct tm *time;       указатель на структуру,
                                   объявленную в 
            
               Описание.
      
               Функция  asctime преобразует время, хранимое как структура,
         в символьную строку. Значение time обычно  получается  из  вызова
         gmtime  или  localtime, которые возвращают указатель на структуру
         tm, объявленную в  (cм. gmtime для описания полей  струк-
         туры  tm).  Результирующая строка, выработанная asctime, содержит
         26 символов и имеет форму, приведенную ниже в примере:
                
               Mon Jan 02 02:03:55 1980\n\0

                                      - 59 -
         
         
                
               Используется 24 часа. Все  поля  имеют  постоянную  ширину.
         Символ  новой строки ('\n') и нулевой символ ('\0') занимают  две
         последние позиции в строке.
            
               Возвращаемое значение.
            
               Функция asctime возвращает указатель на  символьную  строку
         результата. Возвращаемого значения в случае ошибки нет.
               См.также ctime, ftime, gmtime, localtime, time, tzset.
            
               Замечание. Функции asctime и ctime используют один и тот же
         статистически захваченный буфер для хранения в нем строки резуль-
         тата. Каждый вызов одной из этих  процедур  уничтожает  результат
         предыдущего вызова.
            
               Пример:
            
            #include 
            #include 
            
            struct tm *newtime;
            long ltime;
            .
            .
            .
            time(<ime);  /*взять время в секундах*/
            newtime=localtime(<ime); /*преобразовать к структуре
                                        tm  и  напечатать  местное
                                        время в виде строки*/
            printf("the current date and time are %s\n",
                 asctime(newtime));
            
      
               ASIN
           
            #include 
            
            double asin(x);
            double x;
            
               Описaние.
            
               Функция  asin вычисляет арксинус x в интервале -n/2 до n/2.
         Значение x должно быть между -1 и 1.
            
               Возвращаемое значение.
            
               Функция asin возвращает результат арксинуса. Если x  меньше
         -1  или больше 1, asin устанавливает errno в EDOM, печатает сооб-
         щение об ошибке DOMAIN в stderr и возвращает 0.
               Обрaботкa ошибок может быть  модифицировaнa  при  изменении
         процедуры matherr.
               См.тaкже acos, atan, atan2, cos, matherr, sin, tan.
            

                                      - 60 -
         
         
               Пример:
            
            #include 
            
            int errno;
            
            main()
            
               {
               float x,y;
               for (errno=EDOM; errno==EDOM; y=asin(x)) {
                    printf("Sine=");
                    scanf("%f", &x);
                    errno = 0;
                            }
               printf("Arc sine of %f\n",x,y);
               }
            
               На выходе:
            
            Sine = -1.001
            asin: DOMAIN error
            Sine = -1
            Arc sine of -1.000000=-1.570796
            
      
               ASSERT
            
            #include 
            
            void assert(expression);
            
               Описание.
            
               Процедура  assert  печатает диагностическое сообщение и за-
         вершает вызванный процесс, если expression ложно,  0.  Диагности-
         ческое сообщение имеет форму:
            
            Assertion failed:  file , line ,
           
         где filename  -  имя  исходного файла, linenumber - номер строки,
         которая ошибочна.
               Если expression истинно (ненулевое), никакого  действия  не
         выполняется.
               Процедура assert обычно используется для обнаружения  логи-
         ческих ошибок в программе. Выражение expression должно быть зада-
         но  таким образом, чтобы оно было истинным, если программа выпол-
         няется как намечено. После того  как  отлажена  программа,  может
         быть  использован специальный "no debug" идентификатор NDEBUG для
         удаления вызовов assert из программы. Если NDEBUG определен  (лю-
         бым  значением)  опцией  командной  строки  /D  или  с директивой
         #define, препроцессор языка Си удаляет все вызовы assert  из  ис-
         ходной программы.
            
               Возвращаемое значение.

                                      - 61 -
         
         
            
               Возвращаемого значения нет.
            
               Замечание. Процедура assert реализована как макро.
            
               Пример:
            
            #include 
            #include 
            
            analyse_string (string)
            char *string;
            
            {
           /*  проверка строки перед обработкой  */
            
            assert (string != NULL);      /*  не может быть NULL,
                                            здесь   должна   быть
                                            строка */
            assert (*string != '\0');     /*    не   может   быть
                                             пустой */
            .
            .
            .
            }.
            
      
               ATAN - ATAN2
            
            #include 
            
            double atan(x);     вычисляет арктангенс x
            double x;
            
            double atan2(y,x);  вычисляет арктангенс y/x
            double x;
            double y;
            
               Описание.
            
               Обе  функции atan и atan2 возвращают результат арктангенса.
         Если оба аргумента atan2 равны 0, функция устанавливает  errno  в
         EDOM,  печатает  сообщение об ошибке DOMAIN в stderr и возвращает
         0.
               Обрaботкa ошибок  может  быть  модифицировaнa  при  исполь-
         зовaнии процедуры matherr.
               См.тaкже acos, asin, cos, matherr, sin, tan.
            
               Пример:
            
            #include 
            
            printf("%.7f\n", atan(1.0));            /* n/4 */
            printf("%.7f\n", atan2(-1.0,1.0));     /* -n/4 */
            

                                      - 62 -
         
         
               На выходе:
            
            0.7853982
            -0.7853982
            
      
               ATOF-ATOL
               
               #include      Использует  либо ,
               #include     либо .
                                           
               double atof (string);  преобразует строку  string в
                                      double
            
               char *string           строка,  подлежащая преобра-
                                      зованию
               int atoi (string)      преобразует строку string  в
                                      int
            
               long atol (string)     преобразует строку string  в
                                      long
            
               char *string           строка, подлежащая  преобра-
                                      зованию
               
               Описание.
               
               Эти функции преобразуют символьную строку в значение с пла-
         вающей  точкой  двойной  точности (atof), в целое значение (atoi)
         или в длинное целое значение (atol).
               Исходная строка string  представляет  собой  последователь-
         ность  символов, которые могут быть интерпретированы как числовое
         значение определенного типа.
               Функция прекращает чтение исходной строки  как только  поя-
         вится  первый  символ,  который не может быть воспринят как часть
         числа (им может быть NULL-символ, завершающий строку).
               Функция atof предполагает, что строка string имеет  следую-
         щую форму:
               
               [whitespace][sign][digits][{d|D|E}[sign]digits]  ,
               
         где  [whitespase]  состоит из пробелов  и/или  знаков  табуляции,
         которые игнорируются; [sign] означает "+" или "-";  [digits]   -
         -  одна или несколько десятичных цифр. Если перед десятичной точ-
         кой нет цифр, то хотя бы одна цифра должна стоять после нее.  Де-
         сятичные  цифры  могут  следовать за показателем степени, который
         состоит из буквы (d,D,e или E) и десятичного целого со знаком.
               Функции atoi и atol не обрабатывают  десятичные  точки  или
         показатели степени. Аргумент string для этих функций имеет вид:
               
               [whitespace][sign]digits     ,
               
         где  whitespace,  sign,  digits обозначают то же, что и для atof.
               
               Возвращаемое значение.

                                      - 63 -
         
         
               
               Каждая из функций возвращает значение типа double, int  или
         long,  получаемое в результате интерпретации входных символов как
         чисел.
      
               Возвращаемое значение равно 0 (0L для atol), если  вход  не
         может  быть  преобразован  в  значение данного типа. Возвращаемое
         значение не определено в случае  переполнения.
               См. также ecvt, fcvt, gcvt.
                
               Пример:
           
               Следующие  примеры показывают, как числа, записанные в виде
         строк, могут быть преобразованы в числовые значения при использо-
         вании функций atof, atoi, atol:
               
               #include 
               
               extern long atol (\ );
               main (\ )
                     {
                     char *s;
                     double x;
                     int i;
                     long l;

                     s=" -2309.12E-15";
                     x=atof(s);
                     printf("%e\t",x);

                     s="7.8912654773d210";
                     x=atof(s);
                     printf("%e\t",x);

                     s="-9885";
                     i=atoi(s);
                     printf("%d\t",i);

                     s="98854 dollars";
                     l=atol(s);
                     printf("%ld\n",l);
                     }
      
               BDOS
            
            #include 
            
            int bdos(dosfn, dosdx, dosal);
            int dosfn;                        номер функции
            unsigned int dosdx;               значение регистра DX
            unsigned int dosal;               значение регистра AL
            
               Описание.
            
               Функция bdos выполняет системный вызов MS DOS, номер  кото-

                                      - 64 -
         
         
         рого определен в dosfn, после размещения соответственно в регист-
         рах DX и AL значений dosdx и dosal. Функция bdos выполняет коман-
         ду INT 21H для осуществления системного вызова.
               Функция   bdos   задается  для  использования  при  вызовах
         DOS-системных вызовов, которые не принимают аргументов  или толь-
         ко принимают их в регистры DX(DH,DL) и/или AL.
            
               Возвращаемое значение.
            
               Функция bdos возвращает значение регистра AX,  запомненного
         системным вызовом.
               См.также intdos, intdosx.
            
               Замечание. Этот вызов не может использоваться для осуществ-
         ления системных вызовов, в которых указываются ошибки посредством
         установки  флага  переноса.  Т.к. Си-программы не имеют доступа к
         этому флагу, статус возвращаемого значения не может быть  опреде-
         лен. В этом случае используется функция intdos.
            
               Пример:
            
               В  следующем  примере выводится подсказка 9 функцией MS DOS
         (вывод строки). Поскольку значение регистра AL не является  необ-
         ходимым,  то  передается 0. Этот пример работает правильно только
         для малой и средней моделей памяти, так как bdos не меняет значе-
         ния сегментов регистров.
            
            #include 
            
            char *buffer = "Enter file name :$";
            
            /* AL не является необходимым, поэтому передается 0 */
            
            bdos(9,(unsigned)buffer,0);

               BESSEL
            
            #include 
           
            double j0(x);
            
            double j1(x);
            
            double jn(n,x);
            
            double y0(x);

            double y1(x);
            
            double yn(n,x);
            
            double x;           значение с плавающей точкой
            int n;              целый порядок
            

                                      - 65 -
                        
               
               Описание.
          
               Процедуры j0, j1, jn вычисляют соответственно функции  Бес-
         селя первой степени порядка - 0, 1 и n.
               Процедуры  y0, y1, yn вычисляют соответственно функции Бес-
         селя второй степени порядка - 0,1 и n. Аргумент x должен быть по-
         ложительным.
            
               Возвращаемое значение.
      
               Эти функции возвращают результат функций Бесселя для x. Ес-
         ли x является отрицательным для y0, y1, yn, процедура  устанавли-
         вает errno в EDOM, печатает сообщение об ошибке DOMAIN в stderr и
         возвращает отрицательное значение HUGE.
               Обрaботкa  ошибок  может  быть модифицировaнa при изменении
         процедуры matherr.
               См.также matherr.
            
               Пример:
            
            #include 
            
            double x, y, z;
            .
            .
            .
            y = j0(x);
            z = yn(3,x);
            
      
               BSEARCH
            
            #include     требуется только для объявления
                                   функции
            
            char *bsearch(key,base,num,width,compare);
            char *key;             ключ поиска
            char *base;            указатель  на  поисковую   базу
                                   данных
            unsigned num,width;    число и размер элементов
            int (*compare)();      указатель на функцию  сравнения
            
               Описание.
            
               Функция bsearch производит двоичный поиск в отсортированном
         массиве из num элементов, размер  каждого  элемента  равен  width
         байт.  Base  -  указатель на начало массива, key - значение ключа
         поиска.
               Аргумент compare является указателем на процедуру,  постав-
         ляемую  пользователем,  которая сравнивает два элемента массива и
         возвращает значение, определяющее их отношение. В течении  поиска
         функция  bsearch  может  вызывать процедуру compare один или нес-
         колько раз, передавая в каждом вызове указатели на  два  элемента
         массива. Процедура должна сравнивать элементы, а затем возвращать
         одно из следующих значений.
                

                                      - 66 -
         
         
              ЗНАЧЕНИЕ            СМЫСЛ ЗНАЧЕНИЯ
            
            меньше 0         element1 меньше, чем element2
                             
               0             element1 равен element2
                             
            больше 0         element1 больше, чем element2
                
            
               Возвращаемое значение.
            
               Функция  bsearch  возвращает  указатель на первое вхождение
         ключа key в массив, на который указывает base.
               Если key не найден, функция возвращает NULL.
               См. также lfind, lsearch, gsort.
            
               Пример:
            
               /* Функция bsearch производит двоичный поиск  в  отсортиро-
         ванном  массиве  для  элемента  "key"  и  возвращает указатель на
         структуру, в которой находится ключ key, или возвращает NULL, ес-
         ли ключа нет. */
            
            #include 
            #include 
            #include 
            int compare();
      
               /* должна быть объявлена как функция */
            
            main (argc, argv)
                 int argc;
                 char **argv;
                 {
            
                  char **result;
                  char *key = "PATH";
            
               /* следующий  оператор  находит  аргумент,  начинающийся  с
         "PATH", в предположении, что аргументы лексикографически отсорти-
         рованы */
            
                  result = (char **)bsearch((char *)&key,
                           (char *)argv, argc, sizeof(char *),
                           compare);
                  if (result)
                     printf ("%s found\n", *result);
                  else
                     printf("PATH not found!\n");
                 }
            
            int compare (arg1, arg2)
                char **arg1, **arg2;
            
                {

                                      - 67 -
         
         
                 return(strncmp(*arg1, *arg2, strlen(*arg1)));
                }.
            
               CABS
            
            #include 
          
            double cabs(z);
            struct  complex  z;  содержит  вещественную  и  мнимую
                                 части
            
               Описание.
            
               Функция  cabs  вычисляет  абсолютное  значение комплексного
         числа. Комплексное число должно быть структурой с типом  complex,
         объявленной в , следующим образом:
            struct complex  {
                    double x,y;
                    };
            
               Вызов cabs эквивалентен следующему:
            
               sgrt(z.x*z.x + z.y*z.y)
               
               Возвращаемое значение.
            
               Функция cabs возвращает абсолютное значение как описано вы-
         ше.  При переполнении функция вызывает процедуру matherr, возвра-
         щает значение HUGE и устанавливает errno в ERANGE.
               См.также abs, fabs, labs.
            
               Пример:
            
            #include 
            
            struct complex value;
            double d;
            
            value.x = 3.0;
            value.y = 4.0;
            
            d = cabs(value);
            
      
               CALLOC
            
            #include     требуется только для объявления
                                   функции
            
            char *calloc(n,size);
            unsigned n;            количество элементов
            unsigned size;         длина каждого элемента в байтах
            Описание
            
               Функция calloc захватывает пространство для хранения масси-

                                      - 68 -
         
         
         ва из n элементов, каждый длиной size байт. Каждый элемент иници-
         ализируется в 0.
            
               Возвращаемое значение.
            
               Функция calloc возвращает  указатель  char  на  захваченное
         пространство.
               В  памяти,  на которую указывает возвращаемое значение, га-
         рантировано выравнивание для хранения любого типа объекта.  Чтобы
         получить  указатель на тип, отличный от char, используется преоб-
         разователь типа возвращаемого значения.
               Возвращается значение NULL, если осталось недостаточно  па-
         мяти.
               См.также free, haloc, hfree, malloc, realloc.
            
               Пример:
            
            #include 
            
            long *lalloc;
                 .
                 .
                 .
         /*  захватывает достаточное количество места для 40 длинных
         целых и инициализирует их в 0 */
            
            lalloc=(long*)calloc(40, sizeof(long));
                                                                
               
               CEIL
            
            #include 
            
            double ceil(x);
            double x;        значение с плавающей точкой
            
               Описание.
            
               Функция ceil возвращает значение double, представляющее на-
         именьшее целое, которое больше или равно x.
            
               Возвращаемое значение.
            
               Функция ceil  возвращает  double  результат.  Возвращаемого
         значения в случае ошибки нет.
      
               См.также floor, fmod.
            
            
               Пример:
           
            #include 
            
            double y;
            .

                                      - 69 -
         
         
            .
            .
            y = ceil(1.05);    /* y = 2.0 */
            y = ceil(-1.05);   /* y = -1.0 */

      
               CGETS
            
            #include    требуется только  для  объявления
                                 функции
            
           
            char *cgets(str);
            char *str;           память для хранения данных
            
            Описание.
                
               Функция  cgets читает строку символов прямо с консоли и за-
         поминает строку и ее длину в местоположении, указанном  str.  Str
         должно быть указателем на массив символов. Первый элемент массива
         -  str[0] должен содержать максимальную длину (в символах) читае-
         мой строки. Массив должен быть достаточно большим,  чтобы  содер-
         жать  строку, символ окончания '\0' и  два дополнительных  байта.
         Функция  cgets продолжает считывать символы, пока не будет прочи-
         тана  комбинация  "ВК-ПС"  или определенное количество  символов.
         Строка  запоминается,  начиная с str[2]. Если  комбинация "ВК-ПС"
         прочитана, перед  запоминанием  она  заменяется  нулевым символом
         '\0'.
               Функция  cgets во втором элементе массива str[1] запоминает
         действительную длину строки.
            
               Возвращаемое значение.
            
               Функция cgets возвращает указатель к началу строки, которая
         находится в str[2]. Возвращаемого значения в случае ошибки нет.
               См.также getch, getche.
            
               Пример:
            
            #include 
            
            char *result;
            int numread;
            .
            .
            .
            *buffer=80; / *максимальное количество символов */
                        
            /* Внимание. *buffer эквивалентно *buffer[0] */
            
               /* следующие операторы вводят строку с клавиатуры и находят
         ее длину: */
            
                result=cgets(buffer);
                numread=buffer[1];

                                      - 70 -
         
         
                
               /* result указывает на строку, numread - на ее длину  ("ВК"
         не считается, т.к. заменяется нулевым символом */.

               CHDIR
            
            #include   требуется  только  для объявления
                                 функции
            
            int chdir(pathname);
            char *pathname;      path-имя  нового  рабочего дирек-
                                 тория
            
               Описание.
            
               Функция chdir изменяет текущий рабочий директорий на дирек-
         торий, определяемый по pathname; pathname должен ссылаться на су-
         ществующий директорий.
            
               Возвращаемое значение.
            
               Функция  chdir возвращает значение 0, если рабочий директо-
         рий успешно изменен. Возвращаемое значение -1 указывает на  ошиб-
         ку;  в  этом случае errno устанавливается в ENOENT, указывая, что
         заданное path-имя не может быть найдено. Ошибки не возникают, ес-
         ли pathname определяет текущий рабочий директорий.
               См.также mkdir, rmdir, system.
            
               Пример:
            
            #include 
            
            /* следующий оператор изменяет текущий рабочий
            ** директорий на директорий корня   */
            
            chdir("/"); /* Замечание: эквивалентно chdir("\\") */
            
      
      
               CHMOD
         
            #include 
            #include 
            #include        требуется только для объявления
                                  функции
            
            int chmod(pathname,pmode);
            char *pathname;       path-имя существующего файла
            int pmode;            разрешенный доступ для файла
            
               Описание.
            
               Функция chmod изменяет разрешенный доступ для файла, задан-
         ного path-именем. Разрешенный доступ управляет чтением и  записью
         файла. Константное выражение pmode состоит из одной или обеих ма-

                                      - 71 -
         
         
         нифестных констант S_IWRITE и S_IREAD, определенных в .
         Любое  другое  значение  для pmode игнорируется. Когда заданы обе
         константы, они объединяются логическим оператором ИЛИ (:). Значе-
         ния аргументов pmode представлены ниже.

            
            ЗНАЧЕНИЕ                      СМЫСЛ ЗНАЧЕНИЯ
            
            S_IWRITE                     разрешена запись
            
            S_IREAD                      разрешено чтение
            
            S_IREAD : S_IWRITE           разрешены чтение и запись
            
               Если разрешение на запись не задано, файл  доступен  только
         для  чтения.  В MS DOS все файлы доступны для чтения, поэтому не-
         возможно задание разрешения  только  на  запись.  Поэтому  режимы
         S_IWRITE и S_IREAD : S_IWRITE являются эквивалентными.
            
               Возвращаемое значение.
            
               Функция  chmod возвращает значение 0, если разрешенный дос-
         туп успешно изменен. Возвращаемое значение -1 свидетельствует  об
         ошибке;  в  этом случае errno устанавливается в ENOENT, указывая,
         что определенный файл не может быть найден.
               См.также access, creat, fstat, open, stat.
            
           
               Пример:
            
            #include 
            #include 
            #include 
            int result;
            .
            .
            .
            result=chmode("data",S_IREAD);
               /* создать файл только для чтения */
            if (result==-1)
               perror("can't change file mode");
            
      
      
               CHSIZE
            
            #include       требуется  только для  объявления
                                 функции
            
            int chsize(handle,size);
            int handle;          handle-р, ссылающийся на открытый
                                 файл
            long size;           новая длина файла в байтах
            
               Описание.

                                      - 72 -
         
         
            
               Функция  chsize увеличивает или уменьшает файл, связанный с
         handle-ром, до размера, определяемого аргументом size. Файл  дол-
         жен  быть  открыт  в  режиме, который разрешает запись. Если файл
         увеличивается, к нему добавляются нулевые символы '\0'. Если файл
         уменьшается,  все  данные от конца укороченного файла до первона-
         чальной длины файла теряются.
            
               Возвращаемое значение.
            
               Функция chsize возвращает значение 0, если файл успешно из-
         менен.  Возвращаемое  значение  -1  свидетельствует  об ошибке  и
         errno устанавливается в одно из следующих значений:
                           
            ЗНАЧЕНИЕ             СМЫСЛ ЗНАЧЕНИЯ
                           
            EACCES         Заданный  файл  определен  только   для
                           чтения. Для версий MS DOS 3.0 и старших,
                           EACCES свидетельствует о принудительной
                           блокировке.(Определенный файл  заблоки-
                           рован для доступа)
                           
            EBADF          Неверный файловый handle
                           
            ENOSPC         На  устройстве не  осталось  свободного
                           места
            
               См.также close, creat, open.
            
               Пример:
            
            #include 
            #include 
            #include 
            #include 
            
            #define MAXSIZE 32768L
            
            int fh, result;
            .
            .
            .
            fh=open("data", O_RDWR|O_CREAT, S_IREAD|S_IWRITE);
      
            .
            .
            .
            /* перед закрытием файла нужно убедиться, что он
            ** не длиннее 32К
            */
            if (lseek(fh,LO,2)>MAXSIZE)
               result=chsize(fh,MAXSIZE);
            
      
               _CLEAR87

                                      - 73 -
         
         
            
            #include 
            
            unsigned int _clear87();  получает  и  очищает слово
                                      статуса  плавающей точки
            
               Описание.
            
               Функция _clear87 получает и стирает слово статуса плавающей
         точки. Слово статуса плавающей точки является  комбинацией  слова
         статуса  8087/80287 и других состояний, обнаруживаемых 8087/80287
         handler-ом, таких как переполнение и потеря значимости стека пла-
         вающей точки.
            
               Возвращаемое значение.
            
               Биты в возвращаемом значении  обозначают  статус  плавающей
         точки.  Смотрите  include-файл  для полного описания би-
         тов, возвращаемых функцией _clear87.
               Замечание. Большинство из математических библиотечных функ-
         ций модифицирует слово статуса 8087/80287 с  непредсказуемым  ре-
         зультатом.  Возвращаемые  значения  функций  _clear87 и _status87
         становятся более достоверными после выполнения нескольких  опера-
         ций  с  плавающей  точкой  с известными состояниями слова статуса
         плавающей точки.
               См.также _control87, _status87.
            
               Пример:
            
            #include 
            #include
            
            double a = 1e-40,b;
            float x,y;
            
            main()
              {
              printf("status=%.4x - clear\n",_clear87());
              y = a;
                
               /* запомненное в y является неточным и с потерянной  значи-
         мостью */
              printf("status=%.4xx - inexact, underflow\n",
                     _clear87());
              b = y;    /* y является неправильным */
              printf("status=%.4x - denormal\n", _clear87());
              }
            
      
               CLEARERR
            
            #include 
            void clearerr(stream);
            
            FILE  *stream;          указатель на структуру FILE

                                      - 74 -
         
         

               Описание.
            
               Функция  clearerr переустанавливает для потока stream инди-
         катор ошибки и индикатор конца файла (EOF) в 0. Индикаторы ошибок
         автоматически не очищаются; если для потока установлен  индикатор
         ошибки,  то операции над потоком будут возвращать значения ошибок
         до тех пор, пока функции clearerr или rewind не будут вызваны.
               См. также функции eof, feof, ferror, perror.
            
               Пример:
            
            #include 
            #include 
            
            FILE *stream;
            int c;

               /* следующие операторы читают данные из потока и проверяют,
         возникла или нет ошибка при чтении. Перед  чтением  поток  должен
         быть предварительно открыт */.
            if ((c=getc(stream))==EOF)
            {  if (ferror(stream))
               {  fprintf(stderr, "write error\n");
                  clearerr(stream);
               }
            }
            
      
            CLOSE.
                    
            #include      требуется  только  для  объявления
                                функции.
            int close(handle);
            int handle;         handle-р,  ссылающийся на открытый
                                файл.
            
               Описание.
            
               Функция   close  закрывает  все  файлы,  ассоциированные  с
         handle.
            
               Возвращаемое значение.
            
               Эта функция возвращает 0, если файл успешно закрыт. Возвра-
         щаемое значение -1 свидетельствует об ошибке; функция errno уста-
         навливается в EBADF, что свидетельствует о неправильном аргументе
         handle-ра файла.
               См. также chsize, creat, dup, dup2, open, unlink.
            
               Пример:
            
            #include 
            #include 
            

                                      - 75 -
         
         
            int fh;
            
            fh = open("data", O_RDONLY);
            .
            .
            .
            close(fh);.
            
            
               _CONTROL87
            
            #include 
            
            unsigned int _control87(new,mask); получает слово уп-
                                               равления плавающей
                                               точки
            
            unsigned int new;                  новые    значения
                                               битов       слова
                                               управления
            
            unsigned int mask;                 устанавливаемая
                                               маска   для новых
                                               битов слова управ-
                                               ления
            
               Описание.
            
               Функция _control87 получает и устанавливает слово  управле-
         ния  плавающей  точки. Слово управления плавающей точки позволяет
         изменять в программе режимы точности, округления и  бесконечности
         для  математического пакета программ с плавающей точкой. Исключи-
         тельные состояния с плавающей точкой также можно маскировать  или
         размаскировать, используя для этого функцию _control87.
               Если  значение  для mask равно 0, тогда _control87 получает
         слово управления с плавающей точкой. Если mask  ненулевая,  уста-
         навливается  новое  значение для слова управления следующим обра-
         зом: для любого бита равного 1 в mask соответствующий бит  в  new
         используется для обновления слова управления словами. Это записы-
         вается так:
            
                fpcntrl=((fpcntrl & ~mask) : (new & mask)),
      
         где fpcntrl является словом управления с плавающей точкой.
            
                Возвращаемое значение.
            
               Биты  в возвращаемом значении обозначают состояние управле-
         ния с плавающей точкой. См. include-файл    для  полного
         описания битов, возвращаемых _control87.
               См.также _clear87, _status87.
            
            
            

                                      - 76 -
         
               Пример:
         
            #include 
            #include

            double a = .1;
            
            main()
               {
               /* получает слово управления */
               printf("control=%.4x\n", _control87(0,0));
               printf("a*a=.01=%.15e\n",a*a);
            
               /* устанавливает точность в 24 бита */
               _control87(PC_24, MCW_PC);
               printf("a*a=.01(rounded to 24 bits)=%.15e\n",a*a);
            
               /* восстанавливает к первоначальному умолчанию */
               _control87(CW_DEFAULT, 0xffff);
               printf("a*a=.01=%.15e\n",a*a);
               }
            
      
               COS-COSH
            
            #include 
            
            double cos(x);      вычисляет косинус x
            double cosh(x);     вычисляет гиперболический косинус
                                x
            double x;           радиан
            
               Описание.
           
               Функции  cos и cosh возвращают соответственно косинус и ги-
         перболический косинус x.
            
               Возвращаемое значение.
            
               Функция cos возвращает косинус x. Если x большой, в резуль-
         тате может возникнуть частичная потеря значимости. В этом  случае
         cos  вырабатывает  ошибку PLOSS, но сообщения не печатает. Если x
         настолько большой, что теряется общая значимость  результата,  то
         cos печатает сообщение об ошибке TLOSS в stderr и возвращает 0. В
         обоих случаях errno устанавливается в ERANGE.
               Функция cosh возвращает гиперболический косинус x. Если ре-
         зультат  большой,  cosh  возвращает значение HUGE и устанавливает
         errno в ERANGE.
               Обрaботкa ошибок  может  быть  модифицировaнa  при  исполь-
         зовaнии процедуры matherr.
               См.также  acos, asin, atan, atan2, matherr, sin, sinh, tan,
         tanh.
            
               Пример:
            
            #include 
            

                                      - 77 -
         
         
            double x,y;
            .
            .
            .
            
            y = cos(x);
            y = cosh(x);
            
      
               CPRINTF
            
           #include       требуется только для объявления
                                   функции
           int cprintf(format-string[,argument...]);
           char *format-string;   строка управления форматом

               Описание.
            
               Функция cprints форматирует и печатает различные символы  и
         значения прямо на консоль, используя для выводимых символов функ-
         цию  putch.  Каждый  arguments (если он есть) преобразовывается и
         выводится  согласно  соответствующей   спецификации   формата   в
         format-string.  Format-string  имеет ту же самую форму и функцию,
         что и аргумент format-string для функции printf (См.описание фун-
         кции printf для получения подробной информации о format-string  и
         аргументах).
            
               Возвращаемое значение.
            
               Функция cprintf возвращает число напечатанных символов.
               См.также fprintf, printf, sprintf, vprintf.
               Замечание!  В отличии от функций sprintf, printf и sprintf,
         функция cprintf на выходе не транслирует символы ПС в  комбинацию
         "ВК-ПС".
            
               Пример:
      
            #include 
            
            int i=-16, j=29;
            unsigned int k=511;
            
           /* следующий оператор напечатает i = -16, j = 0x1d, k = 511 */
            cprintf("i=%d, j=%#x, k=%u\n", i,j,k);
            
            
               CPUTS
            
            #include      требуется только для объявления
                                   функции
            
            void cputs(str);
            char *str;             указатель на выводимую строку
            

                                      - 78 -
         
         
               Описание.
            
               Функция  cputs  записывает  строку,  оканчивающуюся нулевым
         символом и на которую указывает str, прямо на консоль.
               Замечание. В строке комбинация "Возврат каретки  -  Перевод
         строки" после записи автоматически не появляется.
            
               Возвращаемое значение.
            
               Возвращаемого значения нет.
           
               См.также putch.
            
               Пример:
            
            #include 
            
            char *buffer = "Insert data disk in drive a: \r\n";
            
            /* следующий оператор выводит подсказку на консоль */.
            
            cputs(buffer);.
            
               CREAT
            
            #include 
            #include 
            #include        требуется только для объявления
                                  функций.
                                  
            int creat(pathname, pmode);
            char *pathname;       path-имя нового файла
            int pmode;            разрешенный режим доступа
                          
               Описание.
            
               Функция creat либо создает новый файл, либо открывает и об-
         новляет  (усекает  до длины 0) существующий файл. Если существует
         файл, определяемый path-именем, то создается новый файл с  задан-
         ным  режимом  доступа и являющийся открытым для записи. Если файл
         существует и его режим доступа позволяет  запись,  тогда  функция
         creat  усекает файл к длине 0, уничтожая все содержимое, и однов-
         ременно открывает файл.
               Разрешенный режим доступа - pmode - применяется только  для
         вновь  созданных  файлов. Новый файл получает установленный режим
         доступа после первого его закрытия. Целое выражение pmode состоит
         из  одной  или  нескольких  манифестных  констант  -  S_IWRITE  и
         S_IREAD,  объявленных  в . Если задаются обе константы,
         они объединяются при помощи логического OR (:). Значение аргумен-
         та pmode приводится ниже.
            
            КОНСТАНТА              СМЫСЛОВОЕ  ЗНАЧЕНИЕ
                                 
            S_IWRITE               разрешает запись
            
            S_IREAD                разрешает чтение

                                      - 79 -
         
         
            
            S_IREAD:S_IWRITE       разрешают чтение и запись
                                
               Если запись не разрешена, файл предназначен только для чте-
         ния. В MS DOS нельзя  разрешить  только  запись.  Поэтому  режимы
         S_IWRITE и S_IREAD: S_IWRITE являются эквивалентными.
               В версиях MS DOS 3.0 и старших файлы, открываемые при помо-
         щи  creat, всегда открываются в совмещенном режиме (compatibility
         mode).
               Функция creat перед установкой  флага  доступа  присваивает
         pmode маске доступа (подробно об этом смотрите umask).
            
               Возвращаемое значение.
            
               В  случае успешного вызова эта функция возвращает handle на
         созданный файл. Возвращаемое значение -1 свидетельствует об ошиб-
         ке; errno устанавливается в одно из следующих значений:
            
            
            ВОЗВРАЩАЕМАЯ              СМЫСЛОВОЕ  ЗНАЧЕНИЕ
            ВЕЛИЧИНА
      
            EACCES           Path-имя   определяет    существующий
                             файл   только   для    чтения     или
                             определяет директорий вместо файла
            
            EMFILE           другие  handle-ры  файла не пригодны,
                             т.к. много открытых файлов
            
            ENOENT           path-имя не найдено.
      
               См. также chmod, chsize, close,  dup,  dup2,  open,  sopen,
         umask.
               Замечание.  Процедура  create  обеспечивает  первоначальную
         совместимость с предыдущими библиотеками. Вызов open  при  помощи
         значений O_CREAT и O_TRUNC, определенных в аргументе oflag, явля-
         ется зквивалентным и предпочтительным для нового кода.
            
               Пример:
            
            #include 
            #include 
            #include 
            #include 
            
            int fh;
            
            fh = creat("data", S_IREAD|S_IWRITE);
            
            if (fh == -1)
                perror("Couldn't create data file");.
            
            
            

                                      - 80 -
         
               CSCANF
         
            #include      требуется только для объявления
                                   функции
            
            int cscanf(format-string[,argument...]);
            char *format-string;   строка управления форматом
            
               Описание.
      
               Функция cscanf читает данные прямо с консоли в место, зада-
         ваемое  arguments  (если они есть), используя для чтения символов
         функцию getch. Каждый аргумент argument должен быть указателем на
         переменную с типом, который соответствует  определенному  типу  в
         format-string. Format-string управляет интерпретацией полей ввода
         и  имеет  ту же самую форму и функцию, что аргумент format-string
         для функции scanf (см. описание функции scanf для получения  под-
         робной информации о format-string).
            
               Возвращаемое значение.
            
               Функция  scanf  возвращает  число успешно преобразованных и
         назначенных полей. Возвращаемое значение не содержит прочитанных,
         но не назначенных полей. При попытке чтения конца файла возвраща-
         ется значение EOF. Возвращаемое значение 0 означает,  что  назна-
         ченных полей нет.
               См.также fscanf, scanf, sscanf.
            
               Пример:
            
            #include 
            
            int result;
            char buffer [20];
            .
            .
            .
            cprintf("Please enter file name: ");
            
         /*  следующий  оператор  запоминает  введенную с клавиатуры
         строку */
            
            result = csanf("%19s", buffer);
            
         /* result - число верно введенных полей. Он равен  0,  если
         нет соответствия */
            
      
               CTIME
            
            #include    требуется только для объявления
                                функции
            char *ctime(time);
            long *time;         указатель на хранимое время
            
           

                                      - 81 -
         
               Описание.
         
               Функция  ctime преобразует время, хранимое как long- значе-
         ние, в символьную строку. Значение time обычно получается из  вы-
         зова функции time, которая возвращает количество секунд, пройден-
         ных от значения времени по Гринвичу, т.е. с 1 января 1980 года.
               Строка  результата, выработанная по ctime, содержит 26 сим-
         волов и имеет форму, приведенную ниже в примере:
                
               Mon Jan 02 02:03:55 1980\n\0
                
               Используется 24 часа. Все  поля  имеют  постоянную  ширину.
         Символ  новой строки ('\n') и нулевой символ ('\0') занимают  две
         последние позиции в строке.
               В MS DOS даты раньше 1980 года  не  понимаются.  Если  time
         представляет дату перед 1 января 1980 года, ctime возвращает сим-
         вольную строку, представленную 00:00:00 January 1,1980.
            
               Возвращаемое значение.
            
               Функция ctime возвращает указатель на символьную строку ре-
         зультата. Возвращаемого значения в случае ошибки нет.
               См.также asctime, ftime, gmtime, localtime, time.
            
               Замечание. Функции asctime и ctime используют один и тот же
         статистически захваченный буфер для хранения в нем строки резуль-
         тата.  Каждый  вызов  одной из этих процедур уничтожает результат
         предыдущего вызова.
            
               Пример:
            
            #include 
            #include 
            
            long time;
            
            time(<ime);
            printf("the time is %s\n",ctime(<ime));
            
      
               DIIEEETOMSBIN-DMSBINTOIEEE
            
            
            #include 
            
            int dieeetomsbin(src8,dst8); преобразует число двойной
                                         точности формата  IEEE  к
                                         двоичному двойному форма-
                                         ту MS
            
            int dmsbintoieee(src8,dst8); преобразует число двойной
                                         точности в  формате  MS к
                                         числу в формате IEEE
            
               Описание.
            
               Процедура dieeetomsbin преобразует число двойной точности в

                                      - 82 -
         
         
         формате IEEE к двоичному формату Microsoft.
               Процедура dmsbintoieee преобразует число двойной точности в
         двоичном формате Microsoft к IEEE формату.
               Эти процедуры позволяют программам Си,  которые  записывают
         числа  с  плавающей точкой в формате IEEE, использовать численные
         данные в полях данных случайного доступа,  созданные  при  помощи
         Microsoft  BASIC,  который  записывает числа с плавающей точкой в
         двоичный формат Microsoft и наоборот.
               Аргумент  src8   является   указателем   на   преобразуемое
         double-значение.  Результат записывается в расположение, заданное
         аргументом dst8.
            
               Возвращаемое значение.
            
               Эти функции возвращают 0, если преобразование  было  успеш-
         ным, и 1 - если преобразование повлекло переполнение.
               См.также fieeetomsbin, fmsbintoieee.
            
               Замечание.  Эти процедуры не обрабатывают IEEE NAN и беско-
         нечность. Необычные IEEE трактуются в преобразованиях как 0.
            
      
               DIFFTIME
            
            
            #include    требуется  только  для  объявления
                                функции
            
            double difftime(time2,time1);
            time_t time2;       тип time_t, объявленный в 
            
            
               Описание.
            
               Функция difftime вычисляет разность между time2 и time1.
            
            
               Возвращаемое значение.
            
               Функция difftime возвращает пройденное время в секундах  от
         time1 до time2 как число с двойной точностью.
               См.также time.
            
            
               Пример:
            
            #include 
            
            int mark[10000];
            
            main()
                {
               /*  это - пример употребления времени посредством использо-
         вания difftime. Она вычисляет, сколько времени ей  потребовалось,
         чтобы найти простые числа от 3 до 10000. Для вывода простого чис-

                                      - 83 -
         
         
         ла  уничтожается  самый  внешний цикл и комментарии ограничителей
         вокруг "printf("%d\t",n);"*/
            
                time_t start, finish;
                register int i, loop, n, num, step;
            
                time(&start);
                for(loop=0; loop<1000; ++loop)
                   for(num=0,n=3;n<10000;n+=2)
                      if(!mark[n]) {
                          /* printf("%d\t",n); */
                          step=2*n;
                          for(i=3*n;i<10000;i+=step)
                                mark[i]=-1;
                          ++num;
                          }
                time(&finish);
            
                /*  в "sieve" печается в среднем 1000 циклов */
            
      
                printf("\nProgram takes %f seconds to find %d
                       primes.\n",
                       difftime(finish,start)/1000,num);
                }
            
               На выходе:
            
            Program takes 0.482000 seconds to find 1228 primes.
            
      
               DOSEXTERR
            
            
            #include 
            
            int dosexterr(buffer);
            struct DOSERROR *buffer;
            
               Описание.
            
               Функция dosexterr получает значение регистра, возвращаемого
         системным вызовом MS DOS 59H, и записывает это значение в  струк-
         туру,  на  которую  указывает  buffer. Эта функция полезна, когда
         системные вызовы вырабатываются в версиях MS DOS 3.0 и старших  и
         которые предлагают расширенную обработку ошибок.  Более  подробно
         системные  вызовы  MS DOS описаны в руководстве "Microsoft MS DOS
         Programmer's Reference Manual".
               Тип структуры DOSERROR объявлен в    и  представляет
         следующее:
            
            struct DOSERROR {
                   int exterror;
                   char class;
                   char action;

                                      - 84 -
         
         
                   char locus;
                   };
            
               Аргумент  NULL-указателя посредством dosexterr определяет в
         AX возвращаемое значение.
            
               Возвращаемое значение.
            
               Функция dosexterr возвращает значение в регистр  AX  (иден-
         тично   значению в поле структуры exterror).
               См.также perror.
            
               Пример:
            
            #include 
            #include 
            #include 
            
            struct DOSERROR doserror;
            int fd;
            
            if ((fd=open("test.dat",O_RDONLY))==-1 {
               dosexterr(&doserror);
               printf("error=%d,class=%d,action=%d,locus=%d\n",
                       doserror.exterror, doserror.class,
                       doserror.action, doserror.locus);
               }
                
               
               DUP - DUP2
            
            #include       требуется  только для  объявления
                                 функций

            int dup(handle);     создает   второй   handle-р   для
                                 открытого файла
            int handle;          handle-р, ссылающийся на открытый
                                 файл
            
            int dup2(handle1, handle2);
                                 форсирует handle1 для  ссылки  на
                                 handle2 файла
            
            int handle1;         handle-р, ссылающийся на открытый
                                 файл
            int handle2;         любое значение handle
            
               Описание.
            
               Функции  dup и dup2 вызывают второй handle-р файла, связан-
         ный с  открытым  файлом.  Операции  в  файле  могут  пересылаться
         handle-ром, тогда как все handle-ры, связанные с заданным файлом,
         используют тот же самый указатель на файл. Создание нового handle
         не влияет на тип доступа файла.
               Функция dup возвращает следующий доступный handle-р для за-

                                      - 85 -
         
         
         данного  файла.  Функция  dup2 форсирует (force) заданный handle,
         т.е. handle2, чтобы сослаться на тот же самый  файл,  на  который
         ссылается handle1. Если во время вызова handle2 связан с открытым
         файлом, то этот файл закрывается.
            
               Возвращаемое значение.
            
               Функция  dup  возвращает новый handle-р файла. Функция dup2
         возвращает 0 в случае успеха. Если возникает ошибка, обе  функции
         возвращают  -1 и errno устанавливается в одно из следующих значе-
         ний.
            
            ВЕЛИЧИНА                 СМЫСЛОВОЕ  ЗНАЧЕНИЕ
            
            EBADF               Неверный handle-р файла
            
            EMFILE              Другие   handle-ры файла  для него
                                не доступны, т.к.  много  открытых
                                файлов

               См. также close, creat, open.
            

               Пример:
            
            #include 
            #include 
      
            int fh;
            .
            .
            .
               /* выбирает другой handle-р файла, чтобы сослаться  на  тот
         же самый файл, на который указывает handle1 (stdout) */
            
            fh = dup(1);
            
            if (fh == -1)
               perror("dup(1) failure");
            
               /*  создает  handle3 файла для ссылки на тот же самый файл,
         на который ссылается handle 1 (stdout). Если handle3 файла  явля-
         ется также открытым, он закрывается первым */
            
            fh = dup2(1,3);
            
            if (fh != 0)
               perror("dup2(1,3) failure");.
            
      
               ECVT
               
            
               #include       требуется    только    для
                                        объявления функции

                                      - 86 -
         
         
               char *ecvt(value, ndigits, decptr,signptr);
               
               double value;            преобразуемое число
                                    
               int ndigits;             количество    запоминаемых
                                        цифр
            
               int *decptr;             указатель  на  запомненное
                                        положение десятичной точки
            
               int *signptr;            указатель  на  запомненный
                                        индикатор  знака
               
            
               Описание.
               Функция  ecvt  преобразовывает  число  с плавающей точкой в
         символьную строку. Value - это число с плавающей точкой,  которое
         должно быть преобразовано. Ecvt запоминает цифры ndigits из value
         как строку и добавляет к ней нулевой символ ('\0'). Если количество
         цифр в value превышает ndigits, последняя значащая цифра округля-
         ется. Если цифр меньше, чем ndigits, строка дополняется нулями.
               В  строке хранятся только цифры. Положение десятичной точки
         и знака в value может быть определено  после  вызова  функции  из
         decptr и signptr. Аргумент decptr указывает на целое число, опре-
         деляющее положение десятичной точки относительно начала строки. 0
         или  отрицательное значение означают, что десятичная точка распо-
         ложена левее первой цифры. Аргумент signptr указывает  на  целое,
         определяющее  знак  преобразуемого  числа.  Если signptr равно 0,
         число положительное, иначе - отрицательное.
               
            
               Возвращаемое значение.
               
               Функция ecvt возвращает указатель на строку цифр. В  случае
         ошибки возвращаемого значения нет.
               См.также atof, atoi, atol, fcvt, gcvt.
           
               Замечание.  Функции ecvt и fcvt используют для преобразова-
         ния один и тот же статически распределенный буфер. Каждое обраще-
         ние к одной из этих процедур уничтожает результат предыдущего об-
         ращения.
            
            
               Пример:
               
               #include 
           
               int decimal, sign;
               char *buffer;
               int preciision=10;
               
      
               buffer=ecvt(3.1415926535,precision,&decimal,&sign);
                  /*буфер содержит "3141592654",decimal=1,sign=0*/
                                        

                                      - 87 -
         
         
               
               EOF
            
            #include       требуется только  для  объявления
                                 функции
            
            int eof(handle);
            int handle;          handle-р, ссылающийся на открытый
                                 файл
            
               Описание.
            
               Функция eof определяет достижение конца  файла  для  файла,
         ассоциированного с handle.
            
               Возвращаемое значение.
            
               Эта функция возвращает значение 1, если текущая позиция яв-
         ляется  концом файла; 0 - в противном случае. Возвращаемое значе-
         ние -1 свидетельствует об ошибке; errno устанавливается в  EBADF,
         инициируя при этом неверный handle файла.
               См. также clearerr, feof, ferror, perror.
            
               Пример:
            
            #include 
            #include 
            
            int fh, count;
            char buf[10];
            
            fh = open("data", O_RDONLY);
            
               /* следующий оператор проверяет перед чтением условие конца
         файла */
            
            while (!eof(fh))
            { count = read(fh, buf, 10);
              .
              .
              .
              }.

      
               EXECL - EXECVPE
            
            
            #include         требуется    только    для
                                        объявления функций
            
            int execl(pathname, arg0, arg1 ... ,argn, NULL);
            
            int execle(pathname, arg0, arg1 ... ,argn, NULL, envp);
            
            int execlp(pathname, arg0, arg1 ... ,argn, NULL);

                                      - 88 -
         
         
            
            int execlpe(pathname, arg0, arg1 ... ,argn, NULL, envp);
            
            int execv(pathname, argv);
            
            int execve(pathname, argv, envp);
            
            int execvp(pathname, argv);
            
            int exevpe(pathname, argv, envp);
            
            char *pathname;                 path-имя  выполняемого
                                            файла
            char *arg0, *arg1, ..., *argn;  список  указателей  на
                                            аргументы
            char *argv[];                   массив  указателей  на
                                            аргументы
            char *envp[];                   массив  указателей  на
                                            установленное  окруже-
                                            ние
               Описание.
            
               Функции  exec  загружают  и  выполняют новый child-процесс.
         Когда вызов произошел успешно, child-процесс размещается в  памя-
         ти,  занятой  вызвавшим  процессом.  Для  загрузки  и  выполнения
         child-процесса должно быть доступно достаточно памяти.
               Pathname может определять полный  path  (из  корня),  часть
         path (из текущего рабочего директория) или просто имя файла.
               Если pathname не имеет расширения для имени файла  или если
         оно не заканчивается точкой (.), тогда функции exec устанавливают
         расширение  .EXE. Если pathname имеет расширение, то используется
         только это расширение. Если pathname заканчивается  точкой,  exec
         осуществляет  поиск  pathname  без  расширения. Процедуры execlp,
         execlpe, execvpe осуществляют поиск для pathname (используя те же
         самые процедуры) в директориях, определенных переменной окружения
         PATH.
               Аргументы для нового процесса передаются  как  аргументы  в
         вызове exec путем задания одного или более указателей на символь-
         ные  строки. Эти символьные строки образуют список аргументов для
         child-процесса. Общая длина строк, определяющая список аргументов
         для нового процесса, не может превышать 128 байтов. Нулевой  сим-
         вол окончания '\0 'для  каждой строки в эту длину не засчитывает-
         ся,а символы пробела (автоматически вставляемые для аргументов) -
         засчитываются.
               Указатели аргументов могут передаваться как отдельные аргу-
         менты  (в execl, execle, execlp, execlpe) или как массив указате-
         лей (в execv, execve, execvp, execvpe). По крайней мере один  ар-
         гумент  -  arg0 или argv[0] - должен быть передан child-процессу.
         По соглашению этот аргумент является копией  аргумента  pathname.
         (Другое  значение  не  будет воспринято как ошибка). В версиях MS
         DOS, ранних от 3.0, передаваемое значение arg0 или argv[0]  явля-
         ется не доступным для использования в child-процессе. Однако, для
         версий  MS  DOS  3.0  и  старших   pathname доступно как arg0 или
         argv[0].
               Вызовы execl, execle, execlp, execlpe  обычно  используются

                                      - 89 -
         
         
         тогда,  когда  количество  аргументов  известно заранее. Аргумент
         arg0 обычно является указателем на pathname. Аргументы от arg1 до
         argn указывают на символьные строки, образующие новый список  ар-
         гументов. Идущий за аргументом argn NULL-указатель определяет ко-
         нец списка аргументов.
               Обычно  вызовы  execv, execve, execvp, execvpe используются
         тогда, когда число аргументов для нового процесса является  пере-
         менным.  Указатели на аргументы пересылаются как массив argv. Ар-
         гумент argv[0] обычно является указателем на pathname.  Аргументы
         от  argv[1] до argv[n] указывают на символьные строки, образующие
         новый список аргументов. Аргумент argv[n+1] должен быть NULL-ука-
         зателем для определения конца списка аргументов.
               Файлы, открытые до вызова exec, остаются открытыми и в  но-
         вом  процессе.  В вызовах execl, execlp, execv, execvp child-про-
         цесс наследует окружение parent-процесса. Вызовы execle, execlpe,
         execve, execvpe позволяют  пользователю  изменять  окружение  для
         child-процесса,  передавая  список установленного окружения через
         аргумент envp.
               Аргумент envp является массивом указателей на char,  каждый
         элемент  которого (исключая последний элемент) указывает на стро-
         ку, которая заканчивается нулем и определяет  переменную  окруже-
         ния. Обычно эта строка имеет форму:
            
               NAME = value   ,
            
         где  NAME -  имя  переменной  окружения,  value  - значение стро-
         ки  (заметим, что  value не заключается в кавычки "..."). Послед-
         ним элементом массива envp должен быть NULL.
               Если значением envp является NULL, child-процесс  наследует
         установленное окружение parent-процесса.

               Возвращаемое значение.
            
               Функции  exec  не  имеют  нормального возврата в вызывающий
         процесс. Если из функции exec происходит возврат, то это означает
         ошибку и возвращаемое значение равно  -1.  Переменная  errno  при
         этом устанавливается в одно из следующих значений:
            
            
            ЗНАЧЕНИЕ               СМЫСЛ ЗНАЧЕНИЯ
      
            
            E2BIG          Список аргументов превышает  128  байт,
                           или    пространство,    требуемое   для
                           информации окружения, превышает 32К
                           
            EACCES         Блокировка  или  разделение файла  (для
                           версий 3.0 и старших)
                           
            EMFILE         Много  открытых файлов (специфицирован-
                           ный файл должен  быть  открыт,    чтобы
                           начать его выполнение)
                           
            ENOENT         Файл или path-имя не найдено
                           

                                      - 90 -
         
         
            ENOEXEC        Заданный файл  не является  выполняемым
                           или имеет неверный формат
                           
            ENOMEM         Доступной   памяти  не  достаточно  для
                           выполнения child-процеса; или доступная
                           память    является   запорченной;   или
                           существуют неверные блоки, указывающие,
                           что parent-процесс неверно размещен

               См.  также  abort,  exit,  _exit,  onexit, spawnl, spawnle,
         spawnlp, spawnlpe, spawnv, spawnve, spawnvp, spawnvpe, system.
               Замечание. Вызовы exec не сохраняют текстовый режим  преоб-
         разования  для открытых файлов. Если child-процесс должен исполь-
         зовать файлы, унаследованные  от  parent-процесса,  тогда  должна
         быть  использована процедура setmode для установки требуемого ре-
         жима преобразования для этих файлов.
               Установки сигналов прерывания не сохраняются  в  child-про-
         цессе,  созданном вызовом процедуры exec. Эти установки переуста-
         навливаются по умолчанию в child-процессе.
            
               Пример:
               
            #include 
            #include 
            
            extern char **environ;
            
            char *args[4];
            int result;
            
            args[0] = "child";
            args[1] = "one";
            args[2] = "two";
            args[3] = NULL;
               
               /*  все  следующие  операторы  позволяют выполнять процесс,
         названный "child.exe", и передать ему три аргумента. */
            
            
            result = execl("child.exe", "child", "one", "two",
                           NULL);
            result = execle("child.exe", "child", "one", "two",
                           NULL, environ);
            result = execlp("child.exe", "child", "one", "two",
                           NULL);
            result = execv("child.exe", args);
            result = execve("child.exe", args, environ);
            result = execvp("child.exe", args);.
            
      
               EXIT - _EXIT
            
            #include    требуется только для объявления
                                   функции
            #include     использует  либо  ,

                                      - 91 -
         
         
                                   либо 
            
            void exit(status);     завершает процесс  после закры-
                                   тия файла
            
            void _exit(status);    завершает процесс  без обновле-
                                   ния буферов потока
            int status;            статус выхода
            
            
               Описание.
            
               Функции exit и _exit завершают вызванный процесс. Перед за-
         вершением  процесса функция exit обновляет все буферы и закрывает
         все открытые файлы. Функция _exit завершает все процессы без  об-
         новления буферов потока. Значение status обычно устанавливается в
         0  для указания нормального выхода и устанавливается в любое дру-
         гое значение для определения  ошибки.  Поскольку  вызовы  exit  и
         _exit  не возвращают значения, младший байт status является возв-
         ратом для ожидающего parent-процесса. Если  нет  parent-процесса,
         то значение status теряется.
            
               Возвращаемое значение.
            
               Возвращаемого значения нет.
               См.также  abort,  execl,  execle,  execlp,  execv,  execve,
         execvp,  onexit,  spawnl,  spawnle,  spawnlp,  spawnv,   spawnve,
         spawnvp, system.
            
               Пример:
            
            #include 
            #include 
            
            FILE *stream;
            .
            .
            .
            
               /*  следующие  операторы вызывают завершение процесса после
         обновления буферов и закрытия открытых файлов */
            
            if((stream=fopen("data","r"))==NULL) {
                fprintf(stderr,"couldn't open data file\n");
                exit (1);
                }
               /* следующие операторы вызывают немедленное завершение про-
         цесса, если файл не может быть открытым */
            
            if((stream=fopen("data","r"))==NULL)
             
                {
      
                fprintf(stderr,"couldn't open data file\n");
                _exit (1);
               
                }
               

                                      - 92 -
         
               
               EXP
            
            
            #include 
            
            double exp(x);
            double x;          значение с плавающей точкой
            
               Описание.
                
               Функция exp возвращает экспоненциальную функцию своего  ар-
         гумента x с плавающей точкой.
                
               Возвращаемое значение.
            
               Функция exp возвращает e в степени x. При переполнении фун-
         кция  возвращает  HUGE и устанавливает errno в ERANGE, при потере
         значимости exp возвращает 0, но не устанавливает errno.
               См.также log.
            
               Пример:
            
            #include 
            
            double x,y;
            .
            .
            .
            y = exp(x);.
            
      
      
               _EXPAND
            
            
            #include     требуется только для объявления
                                   функции
            
            char *_expand(ptr,size);
            char *ptr;             указатель на ранее  захваченный
                                   блок памяти
            unsigned size;         новый размер в байтах
            
            
               Описание.
            
               Функция _expand изменяет размер  ранее  захваченных  блоков
         памяти,  пытаясь  расширить  или сузить блок без передвижения его
         местоположения в heap.
               Аргумент ptr указывает на начало блока. Аргумент size зада-
         ет новый размер блока в байтах. Содержимое блоков не изменяется.
               Аргумент ptr также указывает на освобождающийся блок до тех

                                      - 93 -
         
         
         пор, пока не будут внешне вызваны calloc, _expand, halloc, malloc
         или realloc, либо пока блок будет свободен.
               Если ptr указывает на освобожденный блок, то этот блок  ос-
         тается свободным и после вызова _expand.
            
               Возвращаемое значение.
            
               Функция  _expand возвращает char-указатель на перезахвачен-
         ный блок памяти. В отличии от realloc, _expand не может  передви-
         гать  блок и изменять его размеры. Это означает, что аргумент ptr
         для _expand является тем же самым, что и  возвращаемое  значение,
         если  памяти  достаточно, чтобы расширить блок без его передвиже-
         ния.
               Возвращается значение NULL, если  памяти  недостаточно  для
         расширения блока. В этом случае объект, на который указывает ptr,
         будет расширен настолько, насколько позволяет его расположение.
               В  памяти,  на которую указывает возвращаемое значение, га-
         рантировано выравнивание для хранения любого типа объекта.
               Новый размер объекта может быть проверен функцией _msize.
               Чтобы получить указатель, тип которого отличен от char, ис-
         пользуется преобразователь типа возвращаемого значения.
               См.также calloc, free, halloc, malloc, _msize, realloc.
            
            
               Пример:
            
            #include 
            #include 
            
            main()
               
              {
               long *oldptr;
               unsigned int newsize=64000;
            
               oldptr=(long*)malloc(10000*sizeof(long));
               printf("Size of memory block pointed to by
                      oldptr=%u\n", _msize(oldptr));
            
               if (_expand(oldptr,newsize)!= NULL)
                 printf("expand was able to increase block
                        to %u\n", _msize(oldptr));
            
               else
                printf("expand was able to increase block to
                       only %u\n", _msize(oldptr));
               }

                      



Яндекс цитирования