В этой главе описываются системные вызовы Linux. Список этих 164
системных вызовов находится в syscalls(2).
Прямой вызов
В большинстве случаев не требуется использовать системные вызовы
напрямую, но бывают случаи, когда Стандартная Библиотека Языка C
(libc) не реализует какую-нибудь полезную функцию.
Очень важно знать прототип системного вызова. Вам нужно знать,
сколько у этого вызова аргументов, каковы их типы, каков тип,
возвращаемый функцией. Есть шесть макросов, облегчающих системные
вызовы. Они выглядят так:
_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.