zoukankan      html  css  js  c++  java
  • Linux中应用程序如何使用系统调用syscall

    最近在做Android,其中一个任务是写一个能在Linux命令行运行的测试AP,运行这个AP就能关闭设备电源,即Power Off。
     
    在 Linux内核中已经找到了关闭电源的函数kernel_power_off(),然后也知道了在sys_reboot()函数中调用 kernel_power_off()的,但是linux的应用程序怎么调用sys_reboot()呢? 经过1天的研究,终于搞明白了
     
    这样的函数属于linux的系统调用函数(System call),需要用system call的方式调用,一共有下面3中途径:
     
    一、使用标准C库函数
     
        例如我们使用open(), read(), write()等标准C函数时,实际上是经过C库包装了的sys_open(),sys_read(),sys_write()等函数,这个包装过程不用我们操心。这应该是属于隐性调用system call。
     
    二、在Linux 2.6.18以前版本
     
        include/asm-arm/unistd.h文件中定义了7个_syscall宏,分别是:
     
    _syscall0(type, name)  
    _syscall1(type, name,type1,arg1)  
    _syscall2(type, name,type1,arg1,type2,arg2)  
    _syscall3(type, name,type1,arg1,type2,arg2,type3,arg3)  
    _syscall4(type, name,type1,arg1,type2,arg2,type3, arg3,type4,arg4)  
    _syscall5(type, name,type1,arg1,type2,arg2,type3, arg3,type4,arg4,type5,arg5)  
    _syscall6(type, name,type1,arg1,type2,arg2,type3, arg3,type4,arg4,type5,arg5,type6,arg6)
     
           这7个宏是用来产生系统调用的函数名的,其中type表示系统调用的返回值类型,name表示该系统调用的名称,typeN、argN分别表示第N个参数的类型和名称,它们的数目和_syscall后面的数字一样大。
     
           另外,include/linux/syscalls.h文件中定义有所用系统调用函数的原型,例如:
     
    asmlinkage int sysinfo(struct sysinfo * info);
     
           在需要系统调用的时候,先找到要调用的函数的声明,看有多少个参数,然后用上面7个宏中的对应的一个,产生函数名,还是以sysinfo为例:
     
    _syscall1(int, sysinfo, struct sysinfo *, info);
     
          然后在调用的地方直接用sysinfo()函数就可以了:
     
    struct sysinfo s_info;  
    int error;  
     
    error = sysinfo(&s_info);  
     
     
    三、在Linux 2.6.19之后的版本
     
          上面的7个宏明显有问题:不近麻烦,而且最多只有6个参数,在2.6.19以后的linux中,废除了_syscallx这7和宏,而使用syscall()函数,这个函数定义在syscall.h中:
     
    int syscall(int number, ...); 
     
          有一个新的概念:系统调用号,就是所用系统调用对应的编号,它们定义在include/asm-arm/unistd.h中。
     
          当需要系统调用时,直接用这个函数,参数number就是需要的函数的系统调用号,例如上面的例子就变成:
     
    struct sysinfo s_info;  
    syscall(__NR_sysinfo, &s_info);
     
    上面的方法中描述的目录可能每个平台上都不太一样,但大概都差不多,文件名应该是一样的

  • 相关阅读:
    static final常量变量的正确书写规范
    Why aren't more desktop apps written with Qt?(quora.com系列文章)
    建议学个一知半解的时候,再看书
    C++中new和delete的背后(最后还是调用了MSVCR90的malloc)
    关于Qt的事件循环以及QEventLoop的简单使用(QEventLoop::quit()能够终止事件循环,事件循环是可以嵌套的)
    QProcess::startDetached(5.10有了一种新的方式)
    微信公众号支付开发
    Middleware

    TOKEN+签名验证
  • 原文地址:https://www.cnblogs.com/lidabo/p/4571006.html
Copyright © 2011-2022 走看看