wordpress历史版本,石家庄关键词优化软件,建一个购物网站大约多少钱,wordpress购物车系统目录
前言#xff1a;
1 直接看代码和现象
2 解释原理
3 将代码改成多进程版本
4 认识所有函数并使用 前言#xff1a;
由前面的章节学习#xff0c;我们已经了解了进程状态#xff0c;进程终止以及进程等待#xff0c;今天#xff0c;我们学习进程替换。进程替换我…目录
前言
1 直接看代码和现象
2 解释原理
3 将代码改成多进程版本
4 认识所有函数并使用 前言
由前面的章节学习我们已经了解了进程状态进程终止以及进程等待今天我们学习进程替换。进程替换我们从如下几个点开始介绍第一直接看现象第二解释原理第三将代码改成多线程版本第四使用所有的替换函数认识参数的含义。
废话不多说直接进入主题。 1 直接看代码和现象
我们使用一段代码进入到进程替换
int main()
{printf(test begin...\n); execl(/usr/bin/ls,-l,NULL);printf(test end...\n); return 0;
} 根据现象我们可以看到第二个printf是没有被执行的但是第一个被执行了而我们使用到的函数叫做进程替换函数它一共有6种本质上我们理解了其中的2 - 3个我们就会使用全部的了。我们不妨使用man手册查看一下
输入 man exec 从文档里面我们可以看到进程替换的函数版本有这么多个每个函数都有返回值但是呢我们不必在意返回值因为通过现象我们看到了执行进程替换函数之后的代码都失效了所以返回值即使接受了也没有用处。
关心的情况只有一种就是进程替换失败但是这种情况十分的少见我们就自然而然的给忽略了。 2 解释原理
首先我们要清楚一个问题进程替换的全名不是进程替换替换的不是进程是程序所以在进程程序替换的这个过程本质上是没有创建新的进程的。
第一个点进程程序替换中是没有创建新进程的无非是程序替换了PCB里面原来的数据。这里我们不妨设想一个点如果PCB里面是自己替换自己的多没意思如果.cpp文件里的PCB可以被Java替换shell脚本替换岂不美哉
第二个点exec函数的作用是什么
exec函数本质是一个加载函数因为有了exec函数在Linux中就可以将程序加载进去因为进程程序替换的本质就是将不同的程序加载到内存里面加载靠的就是exec*函数。 3 将代码改成多进程版本
将代码改成多线程版本我们要做的事就是父进程创建子进程创建了之后子进程执行被替换的程序父进程只需要等待多个子进程就可以了。
此时子进程的作用就有了两个一个是执行父进程的代码部分一个是让子进程执行一个全新的程序。
int main()
{printf(testexec ... begin!\n);pid_t id fork();if (id 0){printf(child pid: %d\n, getpid());//childexecl(/usr/bin/ls, ls, -l, NULL);exit(1);}int status 0;pid_t rid waitpid(id, status, 0);if (rid 0){printf(father wait success, child exit code: %d\n, WEXITSTATUS(status));}printf(testexec ... end!\n);return 0;
}该程序创建了一个子进程子进程实现execl如果执行失败也就是替换失败就走exit程序直接退出退出码为1此时父进程只需要等待即可 以上是现象今天的重点都不是前三个直接进入第四个。 4 认识所有函数并使用 所有的函数一共有execl execlp execle execv execvp execvpe不难发现拿命令行参数进行举例的话选项一共有l p e v。
由参数我们可以看到有pathname 和file我们第一个使用的pathname即路径名我们要从哪里执行程序得通过该路径告诉它file同理就是文件名那么对于execl代表的就是列表也就是在命令行中我们如何执行在该函数里面就怎么书写即可。
拿这个举例 execl(/usr/bin/ls,ls.-l,NULL); 因为有l所以我们要将平常执行ls命令的时候如何执行的给列出来这个参数不是固定所以我们可以执行很多ls -l -a -n都是可以的但是注意点是最后的参数一定要是NULL代表结束。
第二个函数
execv这里面的v代表的是vectorC中的顺序表所以我们看execv的参数是[]也就是我们应该这样干
int main()
{char* const argv[] {(char*)ls,(char*)-l,(char*)-a,(char*)--color,NULL};execv(/usr/bin/ls, argv);return 0;
}
但是注意点是最后结尾的仍然要是NULL这里的强转char*不是很必要看自己的版本是否会进行报错吧。
对于execvp
p代表的是PATH也就是环境变量用户可以不用传对应的路径但是要传对应的文件就像
int main()
{char* const argv[] {(char*)ls,(char*)-l,(char*)-a,(char*)--color,NULL};//execv(/usr/bin/ls, argv);execvp(ls,argv);return 0;
}
那么现在关于execlp就应该不用介绍了吧llist出来命令行怎么写的即可p我们传对应的文件名即可。
现在还没介绍的就只有e了e多好理解environment环境变量嘛不就是当然了因为父进程本身就有环境变量子进程哪里用得着担心我没有环境变量啥的根本不担心
使用这里就不介绍了同理即可。
本文是非常粗略的介绍了一下进程程序替换很多细节没有介绍到博主会在后面全部重新翻新的 感谢阅读