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

宁波网站设计价格北京 网站建设|小程序|软件开发|app开发公司

宁波网站设计价格,北京 网站建设|小程序|软件开发|app开发公司,有没有做底单的网站,免费软件视频👍作者主页:进击的1 🤩 专栏链接:【1的Linux】 文章目录 一,什么是进程替换二,替换函数三,实现我们自己的shell 一,什么是进程替换 我们创建出来进程是要其做事情的,它可…

👍作者主页:进击的1++
🤩 专栏链接:【1++的Linux】

文章目录

  • 一,什么是进程替换
  • 二,替换函数
  • 三,实现我们自己的shell

一,什么是进程替换

我们创建出来进程是要其做事情的,它可以去调用函数,或者是执行其他的程序,子进程通过exec函数族执行其他的程序就叫做进程替换。也就是在调用进程内部执行一个可执行文件。当进程调用一种exec函数时,该进程的代码和数据完全被新程序替换,新程序从main函数开始执行,由于未创建新进程,所以替换前后进程的id等并不改变。
在加载新程序之前,父子进程的关系是:代码共享,数据写时拷贝。
当子进程加载新程序的时候就是一种“写入”,此时代码也就需要进行写时拷贝,进行分离!!!

二,替换函数

下面是六种exec开头的函数,统称exec函数。

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[]);


其中只有execve()是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。
这些函数,如果调用成功则加载新的程序开始执行,不再返回;若调用失败,则返回-1 。
下面是这些函数的演示:

#include<stdio.h>
#include<unistd.h>
int main()
{//execl---带路径,参数包传参//execl("/usr/bin/ps","ps","-ef",NULL);// execlp("ls","-l",NULL);char* env[]={"PATH=/bin:/usr/bin",NULL};char* argv[]={"ls","-l",NULL};// execv("/usr/bin/ls",argv);// execle("./mike","mike",NULL,env);// execvp("ls",argv);execve("/usr/bin/ls",argv,env);return 0;
}

execl运行结果(要写路径,参数格式未列表)
在这里插入图片描述
execlp运行结果(带p的:可以使用环境变量PATH,无需写路径)
在这里插入图片描述
execle运行结果:

在这里插入图片描述
execv运行结果:
在这里插入图片描述
execvp运行结果:

在这里插入图片描述
execve运行结果:

在这里插入图片描述
我们总结以下:

带p可以使用环境变量PATH,无需写完整路径
带e,自己组装环境变量。// 改变替换程序的环境变量,正确来说,让替换程序只保留 env 的环境变量
带l参数格式为列表
带v参数格式为数组

事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在man手册第3节。
在这里插入图片描述

exec*实际上就是一个加载器的底层接口。

三,实现我们自己的shell

代码如下:

#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<stdlib.h>
#include<string.h>
#define NUM 32
char cmd_line[NUM];
char* _argv[32];
char myval[32];//这个buffer用来保存我们添加的环境变量,不然保存在cmd_line中会被覆盖。
int main()
{extern char** environ;//是一个外部的全局变量,储存着系统的全局变量。while(1){//打印提示信息printf("[hyp @myshell]#");fflush(stdout);memset(cmd_line,'\0',sizeof(cmd_line));//用户输入if(fgets(cmd_line,sizeof(cmd_line),stdin)==NULL){continue;}cmd_line[strlen(cmd_line)-1]='\0';//分割字符_argv[0]=strtok(cmd_line," ");int i=0;if(strcmp(_argv[0],"ls")==0)//加颜色{_argv[++i]="--color=auto";}if(strcmp(_argv[0],"ll")==0){_argv[0]="ls";_argv[++i]="--color=auto";_argv[++i]="-l";}while(_argv[i])//分割{i++;_argv[i]=strtok(NULL," ");}if(strcmp(_argv[0],"export")==0 && _argv[1]!=NULL){strcpy(myval,_argv[1]);int ret=putenv(myval);if(ret==0){printf("%s export success\n",myval);}continue;}if(strcmp(_argv[0],"cd")==0){if(_argv[1]!=NULL){//内置命令,让父进程自己执行的命令,本质就是shell的一个函数调用。chdir(_argv[1]);//改变当前工作目录}continue;}int id=fork();if(id==0)//child{printf("child MYVAL:%s\n",getenv("MYVAL"));printf("PATH:%s\n",getenv("PATH"));execvp(_argv[0],_argv);exit(1);}//fatherint status=0;int ret=waitpid(id,&status,0);if(ret>0){printf("退出码:%d\n",WEXITSTATUS(status));}}return 0;
}
http://www.yayakq.cn/news/198219/

相关文章:

  • 创意设计一个网站静态企业网站模板
  • 企业网站色彩漳州网络推广
  • 企业网站建设套餐网络服务物业管理
  • 丹徒网站建设怎么样网站提交收录软件
  • 网站建设与维护王欣医院网站可信认证必须做吗
  • 建手机wap网站大概多少钱商标如何自己注册
  • 迅雷下载宝 做网站公司装修开工仪式需要准备什么
  • 惠州网站建设 英语全球十大it公司
  • 全国当先的网络建站推广号店网站建设公司
  • 劳务公司起名字大全免费seo网站推广杭州
  • ip网站怎么做设计制作散发寄递销售展示使用
  • 企业服务建设网站论坛推广平台有哪些
  • 电子商务网站开发过程论文6湖南省交通建设质监局网站
  • 网站后台发布文章开发一个公众号需要多少钱
  • 网站功能设计指什么wordpress-5.2.2英文转中文
  • 鸣蝉建站平台昆明好的网站开发公司
  • 个人 网站备案 幕布世界杯哪个网站做代理
  • 做数据结构基础的网站网站建设工作室
  • 网站设计说明书整合张家口网站设计
  • 网站网络营销外包检测网站开发语言
  • 网站推广有哪些常用的方法网上开店能赚钱吗
  • 免费企业网站创建网站建设的公司业务
  • 大连商城网站制作公司银川网站建设推广
  • 惠东东莞网站建设手机网站建设视频
  • 网站开发学历要求空包网网站怎么做的
  • 旅游网站建设规划报告怎么写ps网站参考线怎么做
  • 上海营销型网站代理付运费送东西的网站怎么做6
  • 网站推广的方案设计怎么写php国内外发展现状
  • 原创网站开发流程如何查询网站打开速度
  • 营销型网站建设系统wordpress数据库发文章