一个网站上能不能放两个域名 两个备案号,公司网站 自己是空间服务商 cms,百度官方营销推广平台,网站源码44444kt进程程序替换
进程程序替换是指将一个正在运行的进程替换为另一个可执行程序。它的本质是调用了Linux操作系统中的exec系统调用。而exec系统调用是一个家族函数#xff0c;例如execl、execv、execle、execve等。它们的共同特点是当当前进程执行到该函数时#xff0c;就会直接…进程程序替换
进程程序替换是指将一个正在运行的进程替换为另一个可执行程序。它的本质是调用了Linux操作系统中的exec系统调用。而exec系统调用是一个家族函数例如execl、execv、execle、execve等。它们的共同特点是当当前进程执行到该函数时就会直接跳转到新的程序并开始执行新的可执行文件。 exec系统调用
所以我们要想知道怎样进行进程程序替换就要先会使用exec系统调用,而且exec系统调用的家族函数只要掌握了一个其他的也就大差不差了。
这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。如果调用出错则返回-1所以exec函数只有出错的返回值而没有成功的返回值。
所以就先详细的讲一下execl函数。
execl系统调用函数
#include unistd.hint execl(const char *path, const char *arg0, ..., const char *argn, (char *)0);
该函数接受可执行文件的路径path以及一系列的参数arg0至argn最后以一个空指针(char *)0结尾。arg0代表可执行文件本身即argv[0]arg1到argn是命令行参数。
代码示例
int main()
{coutbefore execlendl;//执行前execl(/usr/bin/ls,ls,-l,-a,NULL);//必须以空结束coutafter execlendl;//执行后return 0;
}我们不难发现我们自己写的一个可执行程序运行的时候在调用execl函数时会执行新的命令可执行程序文件而且在执行完成之后就直接结束了并没有执行我们自己写的可执行程序的后续操作。就相当于在代码中调用其他程序。所以可以初步得出当execl函数成功执行时当前进程将被替换为指定的可执行文件并从该文件开始执行。注意execl函数不会创建新的进程而是将当前进程替换为新的可执行文件。 函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。 如果调用出错则返回-1 所以exec函数只有出错的返回值而没有成功的返回值。 执行原理
当我们运行我们的可执行程序时该程序就已经变成了进程了所以自然就少不了进程PCB以及进程地址空间和页表和代码数据所映射的物理内存。但是当我们执行到execl函数时就要开始执行一个已有的全新程序并不创建进程而该已有的程序文件自然存在磁盘当中所以我们运行这个新的程序时就要将程序加载进内存。但是关键的是该新程序中的代码和数据并不是另存的而是直接以覆盖式的存放在原进程的代码和数据所在物理内存中对应的位置并继续从新程序的启动例程开始执行。
以上就是单进程程序替换的过程 多进程的程序替换
int main()
{pid_t ifork();if(i0)//子进程{ coutbefore execl,mypid:getpid()endl;execl(/usr/bin/ls,ls,-l,-a,NULL);//必须以空 结束coutafter execl,mypid:getpid()endl;}else//父进程{pid_t retwaitpid(-1,NULL,0);if(reti)cout等待成功,retendl;}return 0;
}我们知道开始我们就创建了一个子进程而创建子进程的特点就是数据独立以写时拷贝的方式存在代码共享。而此时子进程执行execl函数,所以子进程就替换成了ls-a-l的一个程序此时新程序的代码数据会覆盖在物理内存上。我们知道正常情况下父子进程数据发生改变时会以写时拷贝的方式另存空间但是代码并不会。可是此时情况特殊所以代码同样也会以写时拷贝的方式另存空间。归根结底还是进程具有独立性 所以回到开始为什么execl函数之后的代码不执行其实就是程序替换导致原进程的代码数据被新程序的代码数据覆盖所以后续的代码自然就没有了更不可能被执行。 其实我们的进程切换对语言是没要求的可以自己随意地切换成其他语言的程序不一定只切换成同语言的程序。
程序替换总结 程序替换是指将当前运行中的进程完全替换为一个新的程序。简单来说就是将当前进程的代码、数据和堆栈等内容替换为新程序的代码、数据和堆栈。 当一个进程执行程序替换时原来进程的代码、数据和堆栈被新程序覆盖然后开始执行新程序的代码。这意味着原来进程的运行状态、打开的文件、socket连接等都会丢失并且无法恢复。新程序从main函数开始执行其运行过程与原程序无关。 而且对于需要传环境变量的exec类系统调用函数而言环境变量属于全局的字符指针数组类型的变量environ而且一个进程的环境变量是源于其父进程的环境变量也就是说子进程会继承父进程的环境变量。不仅仅是创建子进程时会继承环境变量和命令行参数而对于进程切换时也是会继承下来的。而对于进程替换而言原进程会采用覆盖环境变量内容的方式让新的进程继承下来也就是说如果原进程调用函数接口时传入的环境变量是自己写的环境变量的话那么切换的新进程会将原进程的环境变量里的内容继承下来。但是如果不想覆盖式传递的话可以采用putenvchar* env_val函数在原环境变量表里去添加新的环境变量env_val此时就不会清空原环境变量里的内容而是添加内容后的环境变量传递给新的进程main函数的第三个参数当中。