当前位置: 首页 > news >正文

海南综合网站网站空间安装

海南综合网站,网站空间安装,手机网站自适应代码,长沙企业网站文章目录 1.进程替换的概念和原理2.如何完成进程替换2.1exec系列函数加载器的底层系统调用接口基于execve的封装--库函数 2.2 int execl(const char *path, const char *arg, ...);1.在当前进程进行替换2.在子进程进行替换 2.3 int execv(const char *path, char *const argv[]… 文章目录 1.进程替换的概念和原理2.如何完成进程替换2.1exec系列函数加载器的底层系统调用接口基于execve的封装--库函数 2.2 int execl(const char *path, const char *arg, ...);1.在当前进程进行替换2.在子进程进行替换 2.3 int execv(const char *path, char *const argv[]);2.4 int execlp(const char *file, const char *arg, ...);2.5 int execvp(const char *file, char *const argv[]);2.6 int execle(const char *path, const char *arg, ..., char * const envp[]);1.Makefile: 一次生成多个可执行程序2.子进程中执行自己写的C/C程序2.1自己写的C/C程序2.2执行自己写的C/C程序 3.子进程中执行自己写的py/sh程序4. int execle(const char *path, const char *arg, ..., char * const envp[]);4.1自己写的C/C程序4.2执行自己写的C/C程序 2.7 int execvpe(const char *file, char *const argv[], char *const envp[]); 1.进程替换的概念和原理 之前讲过fork()函数的用法: 一个父进程希望复制自己使父子进程同时执行不同的代码段。例如父进程不处理客户端请求生成子 进程来处理这个请求。一个进程要执行一个不同的程序。例如子进程从fork返回后调用exec函数。进程替换 fork()之后 父子进程各自执行父进程代码的一部分 如果子进程想执行一个另外的/全新的程序要怎么做呢? 本来父子进程共享代码和数据 (数据写时拷贝) 子进程怎么去拥有自己的代码呢? 进程替换完成这个功能: 通过特定的接口 把磁盘上一个全新的程序(代码和数据)加载到子进程的地址空间中 当进程替换后 都会发生什么呢? 新程序的代码和数据加载到内存进程替换并没有创建新的进程 所以该进程的pid并不改变原进程即被替换的进程的PCB/进程地址空间/页表没有释放 新程序的PCB/进程地址空间/页表没有被创建 而是将原进程的PCB/进程地址空间/页表的内容完全替换成新程序的PCB/进程地址空间/页表的内容 页表左侧替换成新程序对应的虚拟地址 页表右侧替换成新程序的物理地址旧进程的用户空间代码和数据完全被新程序替换 从新程序的启动例程开始执行 如何完成这一系列操作? 操作系统的接口exec函数: 加载新程序代码和数据到内存 建立新的映射关系 2.如何完成进程替换 2.1exec系列函数 加载器的底层系统调用接口 #include unistd.h int execve(const char *filename, char *const argv[], char *const envp[]);基于execve的封装–库函数 #include unistd.hextern char **environ;int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(const char *path, const char *arg, ..., char * const envp[]);int execv(const char *path, char *const argv[]);int execvp(const char *file, char *const argv[]);int execvpe(const char *file, char *const argv[], char *const envp[]);命名理解 l(list) : 参数采用列表形式 v(vector) : 参数用数组形式 p(path) : 自动搜索环境变量PATH e(env) : 自己维护环境变量 2.2 int execl(const char *path, const char *arg, …); 1.在当前进程进行替换 int execl(const char *path, const char *arg, ...);execl: l--list 像结点一样将参数传入可变参数列表path: 路径目标文件名arg: 可变参数列表 可以传入多个参数(个数不定)调用时: 以NULL结尾 表示参数传递完毕execl()函数: 函数调用成功后 当前的代码和数据完全被新程序的代码和数据替换函数调用失败后会返回-1(执行原代码 对原代码无影响) 表示调用新程序失败 调用成功没有返回值 因为调用成功后当前代码和数据完全被替换 而execl()就在其中 代码演示 #include stdio.h #include stdlib.h #include unistd.hint main() {printf(当前进程开始运行\n);//execl(/usr/bin/ls, ls, NULL);execl(/usr/bin/ls, ls, -l, -a, -i, NULL);//execl(/usr/bin/top, top, NULL);//execl(/usr/bin/ls, ls, --colorauto, -l, NULL);ls是一个用C语言写的程序 他也有main函数 实际上 这里的传参就是把参数传给了ls程序里的main函数 这也与我们之前讲到的命令行参数的空间布局相呼应 exit(1);printf(当前进程结束!\n);return 0; } 为什么在xshell下执行ls 就会有颜色 而在我们的程序里执行ls 还要加--colorauto才会有颜色? 因为在bash进程里给ls取了别名 自动就会加--colorauto 2.在子进程进行替换 在子进程进行进程替换的目的 不影响父进程 让父进程聚焦在读取数据解析数据指派子进程执行代码让子进程被替换的目的是去执行新的程序而不是执行父进程的不同代码 所以让子进程进行替换的目的就是让父进程仍然执行他自己的代码 让子进程执行一个新的程序 并且父进程不受影响 对子进程进行程序替换的理解 子进程被替换前 父子进程代码共享 数据写时拷贝当子进程发生进程替换 会有一份新的程序(代码数据)完全覆盖子进程原有内容 此时会发生写时拷贝 即当子进程发生进程替换 子进程在物理内存中将会有自己的单独空间(新程序) #include stdio.h #include stdlib.h #include unistd.h #include sys/wait.hint main(int argc, char*argv[], char *env[]) {pid_t id fork();if(id 0){//子进程printf(子进程开始运行, pid: %d\n, getpid());sleep(3);execl(/usr/bin/ls, ls, -a, -l, NULL);exit(1);}else {//父进程printf(父进程开始运行, pid: %d\n, getpid());int status 0;pid_t id waitpid(-1, status, 0);if(id 0){printf(wait success, exit code: %d\n, WEXITSTATUS(status));}}return 0; }2.3 int execv(const char *path, char *const argv[]); #include stdio.h #include stdlib.h #include unistd.h #include sys/wait.h#define NUM 16 int main(int argc, char*argv[], char *env[]) {pid_t id fork();if(id 0){//子进程printf(子进程开始运行, pid: %d\n, getpid());sleep(3);char *const _argv[NUM] {(char*)ls,(char*)-a,(char*)-l,(char*)-i,NULL};//execl(/usr/bin/ls, ls, -a, -l, NULL);execv(/usr/bin/ls, _argv);exit(1);}else {//父进程printf(父进程开始运行, pid: %d\n, getpid());int status 0;pid_t id waitpid(-1, status, 0); if(id 0){printf(wait success, exit code: %d\n, WEXITSTATUS(status));}}return 0; }2.4 int execlp(const char *file, const char *arg, …); 自动在环境变量PATH中查找文件名的路径 #include stdio.h #include stdlib.h #include unistd.h #include sys/wait.h#define NUM 16 int main(int argc, char*argv[], char *env[]) {pid_t id fork();if(id 0){//子进程printf(子进程开始运行, pid: %d\n, getpid());sleep(3);char *const _argv[NUM] {(char*)ls,(char*)-a,(char*)-l,(char*)-i,NULL};//execl(/usr/bin/ls, ls, -a, -l, NULL);//execv(/usr/bin/ls, _argv); execlp(ls, ls, -a, -l, NULL);exit(1);}else {//父进程printf(父进程开始运行, pid: %d\n, getpid());int status 0;pid_t id waitpid(-1, status, 0); if(id 0){printf(wait success, exit code: %d\n, WEXITSTATUS(status));}}return 0; }2.5 int execvp(const char *file, char *const argv[]); #include stdio.h #include stdlib.h #include unistd.h #include sys/wait.h#define NUM 16 int main(int argc, char*argv[], char *env[]) {pid_t id fork();if(id 0){//子进程printf(子进程开始运行, pid: %d\n, getpid());sleep(3);char *const _argv[NUM] {(char*)ls,(char*)-a,(char*)-l,(char*)-i,NULL};//execl(/usr/bin/ls, ls, -a, -l, NULL);//execv(/usr/bin/ls, _argv); //和上面的execl只有传参方式的区别//execlp(ls, ls, -a, -l, NULL);execvp(ls, _argv);exit(1);}else {//父进程printf(父进程开始运行, pid: %d\n, getpid());int status 0;pid_t id waitpid(-1, status, 0); if(id 0){printf(wait success, exit code: %d\n, WEXITSTATUS(status));}}return 0; }2.6 int execle(const char *path, const char *arg, …, char * const envp[]); 1.Makefile: 一次生成多个可执行程序 2.子进程中执行自己写的C/C程序 2.1自己写的C/C程序 #include stdio.h #include string.h #include stdlib.hint main(int argc, char *argv[]) {if(argc ! 2){printf(can not execute\n);exit(1);}printf(获取环境变量: VIRTUALENV: %s\n, getenv(VIRTUALENV));if(strcmp(argv[1], -a) 0){printf(hello a!\n);}else if(strcmp(argv[1], -b) 0){printf(hello b!\n);}else{printf(default!\n);}return 0; }2.2执行自己写的C/C程序 #include stdio.h #include stdlib.h #include unistd.h #include sys/wait.h#define NUM 16//const char *fileaddr /home/lhr/linux/procreplace/cmd; const char *fileaddr ./cmd;int main(int argc, char*argv[], char *env[]) {pid_t id fork();if(id 0){//子进程printf(子进程开始运行, pid: %d\n, getpid());sleep(3);char *const _argv[NUM] {(char*)ls,(char*)-a,(char*)-l,(char*)-i,NULL};execle(fileaddr, cmd, -a, NULL);//execle(fileaddr, cmd, -a, NULL);//execl(/usr/bin/ls, ls, -a, -l, NULL);//execv(/usr/bin/ls, _argv); //和上面的execl只有传参方式的区别//execlp(ls, ls, -a, -l, NULL);//execvp(ls, _argv);exit(1);}else {//父进程printf(父进程开始运行, pid: %d\n, getpid());int status 0;pid_t id waitpid(-1, status, 0); if(id 0){printf(wait success, exit code: %d\n, WEXITSTATUS(status));}}return 0; }3.子进程中执行自己写的py/sh程序 test.py #! /usr/bin/python3.6 print(hello Python) print(hello Python) print(hello Python)test.sh #! /usr/bin/bash echo hello shell! echo hello shell! echo hello shell!#include stdio.h #include stdlib.h #include unistd.h #include sys/wait.h#define NUM 16int main(int argc, char*argv[], char *env[]) {pid_t id fork();if(id 0){//子进程printf(子进程开始运行, pid: %d\n, getpid());sleep(3);在命令行下: python test.py ./test.py (自动调用解释器)//execlp(./test.py, test.py, NULL);//execlp(bash, bash, test.sh, NULL);//execlp(python, python, test.py, NULL);py/sh/java: 有解释器 在解释器(也是一个程序)内编译执行对应程序exit(1);}else {//父进程printf(父进程开始运行, pid: %d\n, getpid());int status 0;pid_t id waitpid(-1, status, 0); if(id 0){printf(wait success, exit code: %d\n, WEXITSTATUS(status));}}return 0; }4. int execle(const char *path, const char *arg, …, char * const envp[]); 4.1自己写的C/C程序 #include stdio.h #include string.h #include stdlib.hint main(int argc, char *argv[]) {if(argc ! 2){printf(can not execute\n);exit(1);}printf(获取环境变量: VIRTUALENV: %s\n, getenv(VIRTUALENV));if(strcmp(argv[1], -a) 0){printf(hello a!\n);}else if(strcmp(argv[1], -b) 0){printf(hello b!\n);}else{printf(default!\n);}return 0; } 4.2执行自己写的C/C程序 #include stdio.h #include stdlib.h #include unistd.h #include sys/wait.h#define NUM 16//const char *fileaddr /home/lhr/linux/procreplace/cmd; const char *fileaddr ./cmd;int main(int argc, char*argv[], char *env[]) {pid_t id fork();if(id 0){//子进程printf(子进程开始运行, pid: %d\n, getpid());sleep(3);char *const _env[NUM] {(char*)VIRTUALENV547993,NULL};char *const _argv[NUM] {(char*)ls,(char*)-a,(char*)-l,(char*)-i,NULL};execle(fileaddr, cmd, -a, NULL, env);//execle(fileaddr, cmd, -a, NULL, _env);exit(1);}else {//父进程printf(父进程开始运行, pid: %d\n, getpid());int status 0;pid_t id waitpid(-1, status, 0);if(id 0){printf(wait success, exit code: %d\n, WEXITSTATUS(status));}}return 0; } 2.7 int execvpe(const char *file, char *const argv[], char *const envp[]); 同上类比
http://www.pierceye.com/news/224179/

相关文章:

  • 天津专业网站制作新乡商城网站建设价格
  • 建筑业务网站建设泉州公司做网站
  • 做网站遇到的问题及解决方法网站快速查找
  • excel做网页放进网站2024年报申报入口官网
  • 伊春住房和城乡建设局网站滨州网站建设制作
  • 芒市网站建设wordpress登入修改
  • 室内设计招标网站mvc网站入口asp
  • 淘宝客怎么建设自己网站wordpress主题模板仿
  • 淄博做网站电话网站建设大赛策划书
  • 网站建设模板网站网站分析的优劣势
  • 医疗网站备案要怎么做 需要准备什么材料高端html5网站建设织梦模板
  • 网站建设支付方式站长之家seo综合
  • 桂林网丫网业管理有限公司外贸网站建设和优化
  • 安徽合肥中国建设银行网站首页如何寻找做网站的客户
  • 网站是怎么做网站建设风险是什么
  • 商丘电子商务网站建设徽文化网站建设方案书
  • 什么网站做视频给钱网上做广告宣传
  • 建网站域名注册后需要做seo是什么意思
  • 做系统正版win10系统下载网站安定网站建设
  • 代码怎么做网站网站建设合同 简单
  • 耐克官网网站设计做一个企业网站需要多少钱
  • 动易手机网站自己开发小程序要多少钱
  • 英迈思做的网站怎么样网站做m版
  • 通州设计网站建设城市宣传片制作公司
  • 南安网站设计网站创意
  • 建设部网站造价注册seo优化易下拉霸屏
  • 西安网站外包上海网站被查
  • 建简单网站高端建筑铝型材
  • wordpress 网站访问量高端建筑物图片
  • seo网站推广目的WordPress灯箱效果移动适配