【小镇的技术之路】Linux中的execve函数

Scapy的第二篇文章今晚发。
execve函数的使用方法本身来说没什么重要,但这是学习strace工具中比较重要的一个环节。
execve函数接受三个参数,execve(value1,value2,value3)
value1:这是命令所在的路径,一般来说是在bin下面
value2:命令的集合,比如说我在Terminal下输入的命令是ls -l ,那么命令的集合就是["ls", "-l"]
value3:传递给执行文件的环境变量集

下面我们来编写一段c语言程序实现ls -l的功能
//lstest.c
#include <stdio.h>  
#include <unistd.h>  
int main(int arg,char **args)  
{  
    //char *name="/usr/bin/ls";  
  
    char *argv[]={"ls","-l","/root/",NULL};
  
    char *envp[]={0,NULL};
  
    execve("/bin/ls",argv,envp);  
   
}  


先让我们来编译运行一下,编译命令为gcc -o lstest lstest.c,输入命令./lstest运行,结果如下:



下面我们来看上面的代码,核心执行的代码就一句话execve("/bin/ls",argv,envp);
1、其中"/bin/ls"是参数一,代表的是执行的路径,这个相信大家都懂。
【ls是个可执行文件,用来显示文件,在bin目录下面】


2、然后参数二是一个命令的集合,比如说我们在Terminal输入的命令是ls -l /root/。那么这个命令分三段,第一段是ls,也就是上面说的可执行文件,第二段是可选参数,-l的意思是使用长列表的形式显示出来。第三个就是要显示的文件夹路径了。
【大家可能比较疑惑char *argv[]这种写法,其实这是种指针数组,千万不要跟数组指针搞混了,数组指针应该写成char (*argv)[],顾名思义,指针数组是一个数组,数组里面存储的是指针,根据上面对argv数组的定义,argv[0]是一个指针,指针指向的是一个字符数组,字符数组的第一位存的是字符‘l’,第二位存的是字符‘s’,所以argv[0][0]=='l',这下大家明白了吧,不清楚的可以自己写段c语言的程序试验一下,小镇就不详细说明了】


3、传递给执行文件的环境变量集,变量集就是{0,NULL},意义不明确,但是对大家理解没有太大用处。


execve函数执行成功不会反悔,但是执行失败则返回-1,失败的原因存在errno中。
错误代码
EACCES 
1. 欲执行的文件不具有用户可执行的权限。
2. 欲执行的文件所属的文件系统是以noexec 方式挂上。
3. 欲执行的文件或script翻译器非一般文件。


EPERM
1.进程处于被追踪模式,执行者并不具有root权限,欲执行的文件具有SUID 或SGID 位。
2.欲执行的文件所属的文件系统是以nosuid方式挂上,欲执行的文件具有SUID 或SGID 位元,但执行者并不具有root权限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值