最近在做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);
 
上面的方法中描述的目录可能每个平台上都不太一样,但大概都差不多,文件名应该是一样的

Linux中应用程序如何使用系统调用syscall的更多相关文章

  1. Linux中各类程序的配置文件位置

    目录 Linux中各类程序的配置文件位置 1.启动引导程序配置文件 2.系统启动文件核脚本 3.网络配置文件 4.超级服务程序配置文件和目录 5.硬件配置 6.硬件访问文件 7.扫描仪配置文件 8.打 ...

  2. linux中应用程序main函数中没有开辟进程的,它应该在那个进程中运行呢?

    1.main函数是一个进程还是一个线程? 不知道你是用c创建的,还是用java创建的. 因为它们都是以main()做为入口开始运行的. 是一个线程,同时还是一个进程. 在现在的操作系统中,都是多线程的 ...

  3. linux中安装程序及账户管理

    程序安装及管理 1. Linux 应用程序基础  Linux命令与应用程序的关系 1):文件位置 系统命令:一般在/bin和/sbin目录中,或为Shell内部指令 应用程序:通常在/usr/bin和 ...

  4. Linux中C程序调试、makefile

    gcc基本语法格式:gcc [-选项] 源文件 [-选项] 目标文件,GCC编译C程序的过程: 预处理:gcc -E hello.c hello.i.-E指定执行到预处理结束,下面类似. 编译:gcc ...

  5. 让linux中的程序崩溃时生成core文件

    当我们的linux程序崩溃的时候,常常会有这样的提示:    Segmentation fault (core dumped)    段错误 (核心已转储)    提示说生成了core文件,但是此功能 ...

  6. Linux中的程序和进程,PID和PPID

    环境:Vmware Workstation:CentOS-6.4-x86_64 程序和进程: 1.程序:程序是静止的,程序就是磁盘上的一个文件. 2.进程:进程是一个正在执行的程序的实例. 3.进程是 ...

  7. linux中关闭程序或进程

  8. linux上应用程序的执行机制

    linux上应用程序的执行机制 执行文件是如何在shell中被"执行"的.本文中尽可能少用一些源码,免得太过于无 聊,主要讲清这个过程,感兴趣的同学可以去查看相应的源码了解更多的信 ...

  9. linux中tab键不能补全,却能切换窗口

    linux中所有程序-设置-窗口管理器-键盘-切换同一应用程序的窗口-清除

随机推荐

  1. Generating SSH Keys [Ubuntu Linux]

    Generating SSH Keys We strongly recommend using an SSH connection when interacting with GitHub. SSH ...

  2. java foreach记录

    实现原理解释: http://blog.csdn.net/a596620989/article/details/6930479 http://stackoverflow.com/questions/8 ...

  3. POJ 2697 A Board Game (bfs模拟)

    比较水的一道题,在4*4的棋盘上有黑白子,现在有某种移动方式,问能否通过它将棋盘从某个状态移动到另一种状态 只要想好怎么保存hash表来去重,其他就差不多了... #include <iostr ...

  4. Codeforces 486C Palindrome Transformation(贪心)

    题目链接:Codeforces 486C Palindrome Transformation 题目大意:给定一个字符串,长度N.指针位置P,问说最少花多少步将字符串变成回文串. 解题思路:事实上仅仅要 ...

  5. laravel敏捷应用

    App Category Recipes dealing with Laravel's App facade Checking Your Environment Checking if You're ...

  6. javascript中的原型理解总结

    经过几天研究查找资料,对原型终于有点理解了,今天就做下总结,不对之处,希望各位能够提出. 1.每一个Javascript对象(null除外)都和另一个对象相关联,“另一个”对象就是我们今天所要总结的原 ...

  7. Java 之 StringTokenizer

    class StringTokenizer Object to: break a string into tokens. Contructs StringTokenizer(String str)   ...

  8. 【iOS开发之OC和JS互调】

    1.OC中调用JS代码 公司的移动端需要加载一个现有的网页,并且要在原网页要做一些小的调整,如将网页的标题改一下加载到手机的app上,此时就可以在app的oc代码中加入JS代码来实现.如下例子,我要加 ...

  9. (一)HTML5 - pushState 无刷新更新地址

    可以解决什么问题: 可以实现网页的ajax加载,同时又能完成URL的改变而没有网页跳转刷新的迹象,就像是改变了网页的hash(#)一样. 优于hash: 避免了改变hash的问题,避免了用户不理解UR ...

  10. 动态代理写connection连接池Demo

    public class JdbcUtil2 { //声明连接池<放到LinkedList中,操作其中对象的速度快 只需要改变连接> private static LinkedList&l ...