_syscall() - Unix、Linux系统调用
广告
名称
_syscall - 在没有库支持的情况下调用系统调用(已过时)
概要
#include <linux/unistd.h>
A _syscall macro
desired system call
|
描述
关于系统调用,最重要的一点是了解其原型。您需要知道有多少个参数、参数的类型以及函数的返回类型。有七个宏可以使实际的系统调用更容易。它们的格式如下:
_syscallX(type,name,type1,arg1,type2,arg2,...)
|
其中
| 标签 | 描述 |
| X | 是0-6,表示系统调用接受的参数个数 |
| 类型 | 是系统调用的返回类型 |
| 名称 | 是系统调用的名称 |
| typeN | 是第N个参数的类型 |
| argN | 是第N个参数的名称 |
这些宏创建一个名为name的函数,并带有您指定的参数。将_syscall()包含到您的源文件中后,您可以通过name调用系统调用。
文件
/usr/include/linux/unistd.h
符合标准
使用这些宏是Linux特有的,并且已弃用。
备注
从内核2.6.18左右开始,_syscall宏已从提供给用户空间的头文件中删除。请改用syscall(2)。(某些架构,特别是ia64,从未提供_syscall宏;在这些架构上,始终需要syscall(2)。)
_syscall()宏不会生成原型。您可能需要创建一个,尤其对于C++用户。
系统调用不需要只返回正数或负数错误代码。您需要阅读源代码才能确定它是如何返回错误的。通常,它是标准错误代码的负数,例如-EPERM。当r非负时,_syscall()宏将返回系统调用的结果r,但当r为负数时,它将返回-1并将变量errno设置为-r。有关错误代码,请参阅errno(3)。
定义系统调用时,参数类型必须通过值传递或通过指针传递(对于结构体之类的聚合体)。
示例
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <linux/unistd.h>
#include <linux/kernel.h>
_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);
exit(EXIT_SUCCESS);
}
|
示例输出
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
|
参见
广告
|