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

阿里云服务器建站外贸公司网站建设费会计科目

阿里云服务器建站,外贸公司网站建设费会计科目,前端静态资源如何部署到cdn上,做网站贷款fork() 之后,⽗⼦各⾃执⾏⽗进程代码的⼀部分如果⼦进程就想执⾏⼀个全新的程序呢?进程的程序 替换来完成这个功能! 程序替换是通过特定的接⼝,加载磁盘上的⼀个全新的程序(代码和数据),加载到调⽤进程的地址空间中&#xff01…

fork() 之后,⽗⼦各⾃执⾏⽗进程代码的⼀部分如果⼦进程就想执⾏⼀个全新的程序呢?进程的程序

替换来完成这个功能!

程序替换是通过特定的接⼝,加载磁盘上的⼀个全新的程序(代码和数据),加载到调⽤进程的地址空间中!

 4.1 替换原理

fork创建⼦进程后执⾏的是和⽗进程相同的程序(但有可能执⾏不同的代码分⽀),⼦进程往往要调⽤⼀种exec函数以执⾏另⼀个程序。当进程调⽤⼀种exec函数时,该进程的⽤⼾空间代码和数据完全被新程序替换,从新程序的启动例程开始执⾏。调⽤exec并不创建新进程,所以调⽤exec前后该进程的id并未改变。

 

 4.2 替换函数

其实有六种以exec开头的函数,统称exec函数:
man exec
#include <unistd.h>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 execve(const char *path, char *const argv[], char *const envp[]);

4.2.1 函数解释

  • 这些函数如果调⽤成功则加载新的程序从启动代码开始执⾏,不再返回。
  • 如果调⽤出错则返回-1
  • 所以exec函数只有出错的返回值⽽没有成功的返回值

4.2.1 函数讲解

第一种:

int execl(const char *path, const char *arg, ...);

知识点:对于接下来讲的exec序列函数中的知识点是通用的

1.一旦exec函数替换,就去执行新代码了,原始后面的代码已经不存在了, 

2.不做返回值判断,只要返回就是失败了。

引出问题:除了替换指令可以替换自己写的程序吗

 先随意写一个语言的代码 c++为例

怎么证明当前你在进行替换的时候,并没有创建新的进程呢,是同一个pid吗?

 

原理:没有在原替换过程,创建新程序,只是把当前进程的代码和数据用新的程序的代码与数据覆盖式的替换,此时子进程与父进程再也没有关系了,他们分离了。

第二种

execlp("ls","ls","-ln","-a",NULL);

第三种

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{printf("我的程序要运行了!\n");if(fork() == 0){printf("I am Child, My Pid Is: %d\n", getpid());sleep(1);char *const argv[] = {  //命令行参数表(char*const)"ls",(char*const)"-l",(char*const)"-a",NULL};execv("/usr/bin/ls", argv);exit(1);}waitpid(-1, NULL, 0);printf("我的程序运行完毕了\n");//return 0;
}

 小知识:所有进程所需要的命令行参数都是通过父进程用exec 传的命令行参数

第四种带有环境变量

相关问题

1. 关于 execve 更新环境变量后以前环境变量消失

execve 函数执行成功后,会用新程序完全替换当前进程的执行映像,包括代码段、数据段等。新程序启动时,使用的是通过 envp 参数传入的环境变量数组。如果传入的 envp 中不包含之前进程的某些环境变量,那么在新程序中这些之前的环境变量就不存在了。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {char *const argv[] = {"echo", "Hello"};char *const new_envp[] = {"MY_NEW_VAR=value",NULL};// 执行echo程序,传递新的环境变量数组,原进程环境变量未传入if (execve("/bin/echo", argv, new_envp) == -1) {perror("execve");exit(EXIT_FAILURE);}return 0;
}

在上述代码中,execve 执行 echo 程序时,只传入了自定义的环境变量数组 new_envp ,原进程的环境变量没有包含在内,所以 echo 程序运行时看不到原进程的环境变量,就好像之前的环境变量 “消失” 了。

2. 使用 putenv 更新环境变量示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {// 定义要设置的环境变量字符串char var_value[] = "MY_VAR=HelloWorld";// 使用putenv设置环境变量if (putenv(var_value) != 0) {perror("putenv");return EXIT_FAILURE;}// 获取并打印环境变量char *value = getenv("MY_VAR");if (value != NULL) {printf("MY_VAR value: %s\n", value);} else {printf("Failed to get MY_VAR\n");}return EXIT_SUCCESS;
}

在这个例子中,putenv 函数用于将 MY_VAR=HelloWorld 这个环境变量添加到当前进程的环境变量表中。putenv 函数接受一个形如 "变量名=变量值" 的字符串参数,如果设置成功,它不会返回错误值;若失败(比如内存分配问题等 ),则返回非零值。之后通过 getenv 函数获取并打印刚刚设置的环境变量的值。

3. 证明不更新环境变量子进程本身有

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork");return EXIT_FAILURE;} else if (pid == 0) {// 子进程char *value = getenv("PATH");if (value != NULL) {printf("子进程中PATH环境变量值: %s\n", value);} else {printf("子进程中获取PATH环境变量失败\n");}return EXIT_SUCCESS;} else {int status;pid_t wpid = waitpid(pid, &status, 0);if (wpid == -1) {perror("waitpid");return EXIT_FAILURE;}return EXIT_SUCCESS;}
}

在这段代码中,通过 fork 创建子进程。子进程中使用 getenv 函数获取 PATH 环境变量(没有对环境变量进行更新操作 )。由于子进程会继承父进程的环境变量,所以在子进程中可以获取到父进程传递下来的 PATH 环境变量的值,从而证明子进程本身在不更新环境变量的情况下,是有从父进程继承来的环境变量的。

 小知识:其实替换函数有七个 ,上面举例了六个,剩下的哪一个是系统调用的,也就是说,为什么那六个就算不写环境变量,也会本身自带,正是因为那六个是语言封装的,自动会调用系统自带的。


文章转载自:

http://Z6qqQPUX.pqnps.cn
http://JUpkJarc.pqnps.cn
http://yG4d5Oqs.pqnps.cn
http://KXhHbzY8.pqnps.cn
http://Z9u3oGp5.pqnps.cn
http://iKZNaFI9.pqnps.cn
http://cWIxz43E.pqnps.cn
http://ifUVTimT.pqnps.cn
http://vqaoB18n.pqnps.cn
http://8KIYbzv4.pqnps.cn
http://mlsYDTCr.pqnps.cn
http://z8ur0lZ5.pqnps.cn
http://HwLA5hJp.pqnps.cn
http://HvOvag2A.pqnps.cn
http://w82QmqQS.pqnps.cn
http://p6GIqJpk.pqnps.cn
http://nO8x4lUa.pqnps.cn
http://nU2dtp6n.pqnps.cn
http://0RwgrXOD.pqnps.cn
http://5Settvj8.pqnps.cn
http://stfpptzQ.pqnps.cn
http://n3eknecE.pqnps.cn
http://IPBdy8wL.pqnps.cn
http://4f9WZ7tO.pqnps.cn
http://AI5vL7Jo.pqnps.cn
http://2JcXmaSK.pqnps.cn
http://1J4vkK26.pqnps.cn
http://Ru8V9A1k.pqnps.cn
http://mHgqmXls.pqnps.cn
http://ZdGQ7UA1.pqnps.cn
http://www.dtcms.com/wzjs/673564.html

相关文章:

  • 上海专业高端网站建设服务公司网站建设与推广方式
  • 大连网站制作案例美食网站建设项目预算
  • 重庆网站建站模板wordpress用cdn打不开后台
  • 医疗网站跳出率平均是多少搜索引擎案例分析结论
  • 工商信息查询网官网潍坊网站seo
  • 义乌外贸公司网站邢台58同城
  • 株洲专业网站排名优化WordPress上下拖动效果
  • 网站建设的付款方式哪里有网站做爰视频
  • 网站策划书的要点国际婚恋网站做翻译合法吗
  • 记事本做网站改变图片大小设计制作实践活动有哪些
  • 网站要怎么样做排名才上得去天汇大厦网站建设公司
  • 邢台网站制作的地方免费移动网站模板下载安装
  • 做h5网站制作口腔建立网站
  • 知名网站建设官网毕业设计做音乐网站可以吗
  • 网站备案如何申请视频直播app下载
  • 舒城做网站华为云服务器怎么建设网站
  • 贵州最好的网站建设推广公司营销型网站用什么系统
  • 深圳市大鹏建设局网站优化关键词排名工具
  • 互联网网站商标如何用wp做企业网站
  • 企业官网seoseo加盟代理
  • 商业网站建站宁波seo怎么做优化公司
  • 威海屋顶防水价格威海做防水网站京东网上购物
  • 山西省网站做网站网站犯法吗
  • 网站开发项目描述怎么开网店?
  • 做外贸最好的网站有哪些合肥网页设计公司校企合作
  • 做旅游网站的需求分析报告定制网站制作公司有哪些
  • 景区网站建设策划书给wordpress注册用户发邮件
  • 雅客网站建设网页设计制作网站总结
  • 肃州区住房和城乡建设局网站wordpress support hls player
  • 福安市教育局建设网站宝山网页设计制作