Provided by: manpages-ru_0.98-4_all bug

ИМЯ

       intro, _syscall - Системные вызовы: введение

ОПИСАНИЕ

       В  этой  главе  описываются  системные  вызовы  Linux.  Список этих 164
       системных вызовов находится в syscalls(2).

   Прямой вызов
       В  большинстве  случаев  не  требуется  использовать  системные  вызовы
       напрямую, но бывают случаи, когда Стандартная Библиотека Языка C (libc)
       не реализует какую-нибудь полезную функцию.

   Краткая Сводка
       #include <linux/unistd.h>

       A _syscall macro

       desired system call

   Настройка
       Очень важно знать прототип системного вызова.  Вам нужно знать, сколько
       у  этого  вызова  аргументов,  каковы  их типы, каков тип, возвращаемый
       функцией.  Есть шесть  макросов,  облегчающих  системные  вызовы.   Они
       выглядят так:

              _syscallX(type,name,type1,arg1,type2,arg2,...)

                     где  X  равно от 0 до 5 и означает количество аргументов,
                             принимаемых системным вызовом

                     type это тип, возвращаемый системным вызовом

                     name название системного вызова

                     typeN тип N-ого аргумента

                     argN имя N-ого аргумента

       Эти макросы создают  функцию,  которая  называется  name,  с  заданными
       аргументами.  После того, как вы включите макрос _syscall() в свой файл
       с исходным кодом, вы можете вызывать функции системы, пользуясь  именем
       name.

ПРИМЕР

       #include <stdio.h>
       #include <linux/unistd.h>     /* for _syscallX macros/related stuff */
       #include <linux/kernel.h>     /* for struct sysinfo */

       _syscall1(int, sysinfo, struct sysinfo *, info);

       /* Note: if you copy directly from the nroff source, remember to
       REMOVE the extra backslashes in the printf statement. */

       int main(void)
       {
            struct sysinfo s_info;
            int error;

            error = sysinfo(&s_info);
            printf("code error = %d\n", error);
               printf("Uptime = %lds\nLoad: 1 min %lu / 5 min %lu / 15 min %lu\n"
                       "RAM: total %lu / free %lu / shared %lu\n"
                       "Memory in buffers = %lu\nSwap: total %lu / free %lu\n"
                       "Number of processes = %d\n",
                 s_info.uptime, s_info.loads[0],
                 s_info.loads[1], s_info.loads[2],
                 s_info.totalram, s_info.freeram,
                 s_info.sharedram, s_info.bufferram,
                 s_info.totalswap, s_info.freeswap,
                 s_info.procs);
            return(0);
       }

Пример Выдачи

       code error = 0
       uptime = 502034s
       Load: 1 min 13376 / 5 min 5504 / 15 min 1152
       RAM: total 15343616 / free 827392 / shared 8237056
       Memory in buffers = 5066752
       Swap: total 27881472 / free 24698880
       Number of processes = 40

ЗАМЕЧАНИЯ

       Макросы  _syscall()  НЕ  создают  прототипа.   Вам  может потребоваться
       создать его вручную, особенно в программе на C++.

       Системные вызовы не обязательно  возвращают  только  положительные  или
       отрицательные  коды  ошибок.   Чтобы  выяснить настоящее положение дел,
       может потребоваться обратиться к исходным текстам.  Обычно  код  ошибки
       --  это  стандартный  код  ошибки  со  знаком  минус, например, -EPERM.
       Макросы _syscall() возвращают результат системного  вызова  r,  если  r
       неотрицательно,  а  в  противном  случае  возвращают -1 и устанавливают
       переменную errno в значение -r.  Коды ошибок описаны в errno(3).

       Некоторые  системные  вызовы,  такие  как  mmap,  требуют  больше  пяти
       аргументов.   Они  обрабатываются  путем помещения аргументов на стек и
       передачи указателя на блок аргументов.

       При  описании  системного  вызова  аргументы  ДОЛЖНЫ  передаваться  "по
       значению"  или  с  помощью  указателя  (для агрегатных типов, например,
       структур).

       Предпочтительный способ вызова системных вызовов, о которых пока ещё не
       знает glibc, состоит в использовании syscall(2).

СООТВЕТСТВИЕ СТАНДАРТАМ

       Для  обозначение  вариантов  Unix  и  разнообразных стандартов, которым
       соответствуют системные вызовы, описанные в  этой  секции  руководства,
       используются различные сокращения:

       SVr4   Unix-System  V  Release  4,  описанная в "Programmer's Reference
              Manual: Operating System API (Intel processors)"  (Prentice-Hall
              1992, ISBN 0-13-951294-2)

       SVID   System  V  Interface Definition (Описание Интерфейса Системы V),
              описанное в "The System V Interface Definition, Fourth Edition".

       POSIX.1
              IEEE   1003.1-1990   часть   1,   также  известный  как  ISO/IEC
              9945-1:1990s,  также  известный  как  "IEEE  Portable  Operating
              System   Interface   for   Computing   Environments"  (Интерфейс
              Переносимой Операционной Системы для Вычислительных Сред  IEEE),
              разъясненный  в  книге  Donald Lewine "POSIX Programmer's Guide"
              (O'Reilly & Associates, Inc., 1991, ISBN 0-937175-73-0.

       POSIX.1b
              IEEE   Std   1003.1b-1993   (стандарт   POSIX.1b),   описывающий
              возможности   работы   в   реальном   времени  под  переносимыми
              операционными  системами,   разъясненный   в   книге   Bill   O.
              Gallmeister "Programming for the real world - POSIX.4" (O'Reilly
              & Associates, Inc. ISBN 1-56592-074-0).

       4.3BSD/4.4BSD
              Версии 4.3  и  4.4.  дистрибуции  Berkeley  Unix.   4.4BSD  была
              обратно совместима с 4.3.

       SUS, SUSv2
              Single  Unix  Specification.   (Разработана  X/Open  и  The Open
              Group.  Смотри также http://www.UNIX-systems.org/version2/.)

       V7     Версия 7, исходная версия Unix от Bell Labs.

ФАЙЛЫ

       /usr/include/linux/unistd.h

СМОТРИ ТАКЖЕ

       errno(3) syscall(2),

ПЕРЕВОД

       Copyright  (C)  Alexey  Mahotkin   <alexm@hsys.msk.ru>   1999,   Виктор
       Вислобоков <corochoone@perm.ru> 2003