execve()函数的研究

exec簇函数,最后,都是调用了execve这个函数!

这个函数的作用,就是去执行一个文件!
典型的用法,就是在shell中,执行一个文件,比如说,一个编译好的文件,叫做helloworld,那么,在shell下执行./helloworld的时候,shell就去fork()一个子进程,然后在子进程里面execve("./helloworld",NULL,NULL);
这样,就执行了这个文件!
具体点:
在shell中:
if(!fork())
{
execve("./helloworld",NULL,NULL);
exit(0);
}
那么,这个execve函数,都做了什么,追一下内核看看!
首先,利用参数(文件名),调用函数namei(filename),能取得这个文件名对应的i节点!
然后把当前进程(子进程)的i节点置成上面取得的那个i节点。
释放所有资源,释放内存页表并且修改LDT。
凶狠的把中断压入的EIP的值都给改了,改成了从上面那个i节点读出的可执行文件的头部那个文件执行的头字段。
更猛的是,把栈也给改了!
好了,这下子跟父进程一点关系都没有了!
中断返回后,程序从i节点指向的那个可执行程序开始执行!
这里,我们注意到个问题!
execve之后,原来的那些代码,都没了,也就是说,上面的那个exit(0),根本执行不到那!因为在execve调用中,代码就换成了那个i节点的了,以前的那些,都释放了!牛!
于是,
#include <stdio.h>
#include <unistd.h>
int main()
{
execve("./helloworld",NULL,NULL);
printf("nothing!/n");
return 0;
}
这个程序输出什么?(假设helloworld程序输出hello world!)
那么,这个程序输出的,就是hello world!
你会想,为什么没有下面的nothing!啊?
因为,execve调用中,这些代码都没有了,代码被替换成helloworld的了,而且,只执行helloworld就完了!
那么,你会说,那怎么执行完helloworld后,继续做事啊?
这样!
#include <stdio.h>
#include <unistd.h>
int main()
{
if(!fork())
execve("./helloworld",NULL,NULL);
else
printf("nothing!/n");
return 0;
}
执行一下,绝大多数会输出hello world!后,输出nothing!
这个execve够变态!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值