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);
上面的方法中描述的目录可能每个平台上都不太一样,但大概都差不多,文件名应该是一样的
Linux中应用程序如何使用系统调用syscall的更多相关文章
- Linux中各类程序的配置文件位置
目录 Linux中各类程序的配置文件位置 1.启动引导程序配置文件 2.系统启动文件核脚本 3.网络配置文件 4.超级服务程序配置文件和目录 5.硬件配置 6.硬件访问文件 7.扫描仪配置文件 8.打 ...
- linux中应用程序main函数中没有开辟进程的,它应该在那个进程中运行呢?
1.main函数是一个进程还是一个线程? 不知道你是用c创建的,还是用java创建的. 因为它们都是以main()做为入口开始运行的. 是一个线程,同时还是一个进程. 在现在的操作系统中,都是多线程的 ...
- linux中安装程序及账户管理
程序安装及管理 1. Linux 应用程序基础 Linux命令与应用程序的关系 1):文件位置 系统命令:一般在/bin和/sbin目录中,或为Shell内部指令 应用程序:通常在/usr/bin和 ...
- Linux中C程序调试、makefile
gcc基本语法格式:gcc [-选项] 源文件 [-选项] 目标文件,GCC编译C程序的过程: 预处理:gcc -E hello.c hello.i.-E指定执行到预处理结束,下面类似. 编译:gcc ...
- 让linux中的程序崩溃时生成core文件
当我们的linux程序崩溃的时候,常常会有这样的提示: Segmentation fault (core dumped) 段错误 (核心已转储) 提示说生成了core文件,但是此功能 ...
- Linux中的程序和进程,PID和PPID
环境:Vmware Workstation:CentOS-6.4-x86_64 程序和进程: 1.程序:程序是静止的,程序就是磁盘上的一个文件. 2.进程:进程是一个正在执行的程序的实例. 3.进程是 ...
- linux中关闭程序或进程
- linux上应用程序的执行机制
linux上应用程序的执行机制 执行文件是如何在shell中被"执行"的.本文中尽可能少用一些源码,免得太过于无 聊,主要讲清这个过程,感兴趣的同学可以去查看相应的源码了解更多的信 ...
- linux中tab键不能补全,却能切换窗口
linux中所有程序-设置-窗口管理器-键盘-切换同一应用程序的窗口-清除
随机推荐
- Generating SSH Keys [Ubuntu Linux]
Generating SSH Keys We strongly recommend using an SSH connection when interacting with GitHub. SSH ...
- java foreach记录
实现原理解释: http://blog.csdn.net/a596620989/article/details/6930479 http://stackoverflow.com/questions/8 ...
- POJ 2697 A Board Game (bfs模拟)
比较水的一道题,在4*4的棋盘上有黑白子,现在有某种移动方式,问能否通过它将棋盘从某个状态移动到另一种状态 只要想好怎么保存hash表来去重,其他就差不多了... #include <iostr ...
- Codeforces 486C Palindrome Transformation(贪心)
题目链接:Codeforces 486C Palindrome Transformation 题目大意:给定一个字符串,长度N.指针位置P,问说最少花多少步将字符串变成回文串. 解题思路:事实上仅仅要 ...
- laravel敏捷应用
App Category Recipes dealing with Laravel's App facade Checking Your Environment Checking if You're ...
- javascript中的原型理解总结
经过几天研究查找资料,对原型终于有点理解了,今天就做下总结,不对之处,希望各位能够提出. 1.每一个Javascript对象(null除外)都和另一个对象相关联,“另一个”对象就是我们今天所要总结的原 ...
- Java 之 StringTokenizer
class StringTokenizer Object to: break a string into tokens. Contructs StringTokenizer(String str) ...
- 【iOS开发之OC和JS互调】
1.OC中调用JS代码 公司的移动端需要加载一个现有的网页,并且要在原网页要做一些小的调整,如将网页的标题改一下加载到手机的app上,此时就可以在app的oc代码中加入JS代码来实现.如下例子,我要加 ...
- (一)HTML5 - pushState 无刷新更新地址
可以解决什么问题: 可以实现网页的ajax加载,同时又能完成URL的改变而没有网页跳转刷新的迹象,就像是改变了网页的hash(#)一样. 优于hash: 避免了改变hash的问题,避免了用户不理解UR ...
- 动态代理写connection连接池Demo
public class JdbcUtil2 { //声明连接池<放到LinkedList中,操作其中对象的速度快 只需要改变连接> private static LinkedList&l ...