_syscall() - Unix、Linux系统调用 - 技术教程
Tutorials Point


  Unix入门
  Unix Shell编程
  高级Unix
  Unix有用参考资料
  Unix有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考资料     讨论论坛     关于TP  

_syscall() - Unix、Linux系统调用


previous next AddThis Social Bookmark Button

广告

名称

_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

参见



previous next Printer Friendly

广告


  

广告



广告
© . All rights reserved.