系统调用是用户程序和linux内核交互的接口,linux的系统
调用有下面三种方式:
在x86与x86_64的系统中,都可以使用int $0x80指令来执行系统调用,参数使用如下:
x86_64引入了一个新指令syscall来执行系统调用,耐纳局参数使用如下:
正茄卖常调用库函数( man 3 execve ),传参方式见 x86 调用约定
查看调用号:头文件
/usr/include/asm/unistd.h 内容如下,所以32位和64位的调用号可以分别在unistd_32.h和unistd_64.h中找到
查看参数: man 2 execve
以 execve 为例, man 2 execve 查看其接口如下: int execve(const char *pathname, char *const argv[], char *const envp[])
下面汇编实现了 execve("/bin/sh"昌让, 0, 0) :
32位:
64位:C语言有一个system函数(在<stdlib.h>头中,C++则为<cstdlib>头),可以用来调用终端命令
。虚则原型如下:int system(const char *cmdline /* 命令字符串 */
)例如,Linux系统中,调用system("ls -la")将输出当前目录下的所有文件详细信息。备誉槐
Windows系统的“终端”(命令提示符)和Linux中的终端不一样,仿友Windows系统中要实现同样功能,需要调用system("dir /a")
对system函数的详细解释见http://baike.baidu.com/subview/627587/14965930.htm。根据调用需求,可以分为两种:
一、仅执行系统命令,不需要该命令的打印结果。
这种情况可以用system函数。形式为
system(cmd)
其中颂笑cmd为char*类型的字符串,包含要执行的命令,命令的执行结果会输出到标准输出。
比如
system("mkdir test")这个执行,会在当前文件夹下创建test文件夹。
二、需要命令执行的打野历含印。
虽然同样可以使用system并重定向到文件,然后打开文件读取,最终删除文件。但这样做比较繁琐,更好的做法是使用popen。
FILE *fp = popen(cmd)
执行cmd中的命令,然后可以以C文件 *** 作方式,读取命令的输出结果。比如:if((fp=popen("pwd","r"))==NULL)//执行获取当前目录的系统命令pwd。
{
printf("执行失败\n")//fp为NULL表示命令执行失败。
}
else
{
char 烂段s[100]
while(fgets(s, 100, fp))//获取文件内容。
printf("%s", s)//输出结果。
pclose(fp)//关闭。
}
评论列表(0条)