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够变态!

execve()函数的研究相关推荐

  1. linux_exec函数族-execl函数-execlp函数-execle函数-execv函数-execvp函数-execve函数

    接上一篇:linux_进程类相关学习-fork函数-getpid函数-getppid函数-getuid函数-geteuid函数-getgid函数-getegid函数-进程之间共享数据-进程gdb调试 ...

  2. Linux 执行新程序:execve() 函数

    系统调用execve()函数作用 在Linux程序中,通过调用execve(),进程能够以全新程序来替换当前运行的程序.再次过程中,将丢弃旧有程序,进程的栈.数据以及堆段会被新程序所替换.这个 exe ...

  3. Linux0.11 execve函数(六)

    系列文章目录 Linux 0.11启动过程分析(一) Linux 0.11 fork 函数(二) Linux0.11 缺页处理(三) Linux0.11 根文件系统挂载(四) Linux0.11 文件 ...

  4. linux中execve的用法,Linux 的 execve 函数

    execve 函数是所有执行程序函数最底层的实现了,其参数为 int execve (const char *__path, char *const __argv[], char *const __e ...

  5. 系统调用功能号与execve函数详解

    先看看下面通过系统调用实现的hello world代码: .section .data msg:.ascii "Hello world!\n" .section .text .gl ...

  6. Linux系统调用之execve函数与标准C库exec函数族(有关于进程方面的函数族)

    前言 如果,想要深入的学习Linux系统调用里面的execve函数与标准C库中的exec函数族,还是需要去自己阅读Linux系统中的帮助文档. 具体输入命令: man 2 execve man 3 e ...

  7. AI 利用BP算法及Sigmoid函数,研究函数f(x)=2sinx-0.7的逼近问题-实验报告

    1. 问题描述及实验要求 (1)写出包含单隐层的正向和反向推倒过程 (2)画出网络结构图 (3)完成算法代码(要求体现推倒过程,也可采用tensorflow完成) (4)画出误差随迭代次数变化曲线.测 ...

  8. 对ajax回调函数的研究

    假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...

  9. C语言中main函数的研究,以及对代码断点调试的研究(王爽老师 汇编语言)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 我们知道作为一个语言本身是不会有诸如从main函数开始运行这样的条件(深层次的说 底层汇编代码不会指定从mian函数开始的这样的条件,程序开始的位 ...

最新文章

  1. unity 物体倾斜角度代码
  2. 压力测试和负载测试区别_如何理解与区分软件性能测试、负载测试、稳定性测试、压力测试...
  3. StringFormat
  4. SpringDataJpa报错: Table 'XX.hibernate_sequence' doesn't exist
  5. 《必然》九、享受重混盛宴,是每个人的机会
  6. spring mvc学习(53):回顾和springmvc返回值类型总结
  7. Linux的应用领域
  8. mysql 备用字段_数据库设计之备用字段
  9. Docker学习总结(31)——使用Maven插件构建docker镜像
  10. java 开三次根号_java里实现开根号
  11. ftp指令及响应代码 (不能说一个不剩,只能说超详细)
  12. matlab中zeta函数,黎曼zeta函数是什么,具体点
  13. xp系统IIS服务器,Windows XP系统如何开启IIS服务
  14. 单细胞论文记录(part19)--A comprehensive comparison on cell-type composition inference for ST data
  15. Python计算:sympy解数学方程
  16. 蜜雪冰城23年创业史:关门3次,被拆4次,创始人被弟弟怼出局
  17. 深入剖析DHCP服务IP地址自动分配原理
  18. Java读取文件转换成byte[]的小结
  19. count的几种写法
  20. 北京爱立信的面试题及流程

热门文章

  1. 对接阿里云内容安全服务(机审视频检测)
  2. 消息队列中间件 Message Queue 简称:MQ
  3. CRM如何进行客户关系管理
  4. 第2章 计算机图形系统概述
  5. base64,base32bit加密解密
  6. 手把手教你实战开发黑白棋实时对战游戏
  7. 三年的php简历_【完整模板】PHP工程师简历-简洁橙色-1-3年经验-Word简历模板
  8. yum.repos.d没有这个文件和目录解决方法
  9. 二.某龙端游中LUA的分析和调用
  10. 微信小程序: input输入框placeholder样式的修改