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