execv函数linux,fork,execv和system解析

程序的运行过程

(1)在内存中划出一片内存空间

(2)将硬盘上可执行文件中的代码(机器指令)拷贝到会出的内存空间空间中

(3)pc指向第一条指令,cpu取指运行

当有os时,以上过程都是通过调用相应的api来实现的。在linux下,os提供2个非常关键的api,fork和exec。

fork:开辟出一块内存空间

exec:将程序代码(机器指令)拷贝到开辟的内存空间中,并让pc指向第一条指令,cpu开始运行,进程就运行起来了,运行起来的进程会与其它的进程切换着并发运行

fork

#include

pid_t fork(void);

(1)功能:从调用该函数的进程复制出子进程,被复制的被称为父进程,复制出来的进程称为子进程。复制后有2个结果:

1)依照父进程内存空间的样子,原样复制地开辟出子进程的内存空间

2)由于子进程的空间是原样复制的父进程空间,因此子进程内存空间中的代码和数据和父进程的完全相同

其实复制父进程的主要目的,就是为了复制出一块内存空间。只不过复制的附带效果是,子进程原样的拷贝了一份父进程的代码和数据,事实上复制出子进程内存空间的主要目的其实是为了exec加载新的程序代码。

(2)返回值

由于子进程原样复制了父进程代码,因此父子进程都会执行fork函数(暂定)

1)父进程的fork,成返回子进程的Pid,失败返回-1

2)子进程的fork,成功返回0 ,失败-1

复制原理:linux有虚拟内存机制,所以父进程是运行在虚拟内存上的,虚拟内存是os通过数据结构基于物理内模拟出来的,因此底层对应的还是物理内存。复制子进程时,会复制父进程的虚拟内存数据结构,那么就得到了子进程的虚拟内存,相应的底层会对应着一片新的物理内存空间,里面放了与父进程一模一样的代码和数据。

exec

父进程fork复制出子进程的内存空间后,子进程内存空间的代码和数据和父进程是相同的,这样没有太大的意义,我们需要在子进程空间里面运行全新的代码,这样才有意义。

exec函数族:execve是系统函数,其它的execl、execv、execle、execlp、execvp都是基于execve封装得到的库函数。

execve函数原型

#include

int execve(const char *filename, char **const argv, char **const envp);

(1)功能:向子进程空间加载新程序代码(编译后的机器指令)。

(2)参数:

1)filename:新程序(可执行文件)所在的路径名

2)argv:传给main函数的参数,比如我可以将命令行参数传过去

3)envp:环境变量表

(3)返回值:函数调用成功不返回,失败则返回-1,且errno被设置

7479e019afec

fork和exec

exec的作用:将新程序代码加载(拷贝)到子进程的内存空间,替换掉原有的与父进程一模一样的代码和数据,让子进程空间运行全新的程序。

在Linux中使用exec函数族主要有以下两种情况:

a. 当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用任何exec 函数族让自己重生。

b. 如果一个进程想执行另一个程序,那么它就可以调用fork函数新建一个进程,然后调用任何一个exec函数使子进程重生。

system

system库函数封装了fork和execve函数,调用时会自动的创建子进程空间,并把新程序的代码加载到子进程空间中,然后运行起来。

#include

int system(const char *command);

(1)功能:创建子进程,并加载新程序到子进程空间,运行起来

(2)参数:新程序的路径名

(3)代码演示

system("ls");

system("ls -al");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值