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

户外用品网站建设项目背景开通的网站怎样安装

户外用品网站建设项目背景,开通的网站怎样安装,阿里云自带wordpress,wordpress火车头插件防重复一.进程创建 1.1 fork函数 我们创建进程的方式有./xxx和fork()两种 在linux中fork函数时非常重要的函数#xff0c;它从已存在进程中创建一个新进程。新进程为子进程#xff0c;而原进程为父进程。 #include unistd.h pid_t fork(void); 返回值#xff1a;自进程…一.进程创建 1.1 fork函数 我们创建进程的方式有./xxx和fork()两种 在linux中fork函数时非常重要的函数它从已存在进程中创建一个新进程。新进程为子进程而原进程为父进程。 #include unistd.h pid_t fork(void); 返回值自进程中返回0父进程返回子进程id出错返回-1 进程调用fork当控制转移到内核中的fork代码后内核做 1.分配新的内存块和内核数据结构给子进程 2.将父进程部分数据结构内容拷贝至子进程 3.添加子进程到系统进程列表当中 4.fork返回开始调度器调度 fork之前父进程独立执行fork之后父子两个执行流分别执行。注意fork之后谁先执行完全由调度器决定。 1.2.fork返回值 1.子进程返回0。 2.父进程返回的是子进程的pid。 1.3.写时拷贝 当子进程被创建出来子进程中的数据和代码都是和父进程共用一份也就是说父子进程的页表中的代码和数据都是只读权限当子进程想要修改数据的时候就会发生缺页中断也就是子进程修改数据的操作被暂停然后操作系统开辟新的空间将数据的数值拷贝进该空间中修改父子进程对于页表中该数据的权限为可读可写将页表的数据地址指向该新开辟的空间操作系统完成这些操作之后子进程修改数据的操作继续进行通过页表完成数据修改。 1.4 fork常规用法 1. 一个父进程希望复制自己使父子进程同时执行不同的代码段。例如父进程等待客户端请求生成子进程来处理请求。 2. 一个进程要执行一个不同的程序。例如子进程从fork返回后调用exec函数。 1.5 fork调用失败的原因 系统中有太多的进程 实际用户的进程数超过了限制 二.进程终止 2.1 进程退出场景 1. 代码运行完毕结果正确 2. 代码运行完毕结果不正确 3. 代码异常终止 main函数的return值是进程的退出码 通过echo $?可以输出最近一次进程退出时的退出码可以看到main函数的return值是进程的退出码 代码执行完毕结果正确只有一种可能所以返回0但是代码运行完毕结果不正确却有很多种可能性在Linux中我们查看到有134种错误的返回 当进程异常终止的时候就相当于程序运行崩溃它的退出码是没有意义的程序正常运行结束之后的退出码才有意义 我们除以0值为例子 它的程序运行会崩溃退出码没有意义  2.2 进程常用退出方法  正常终止可以通过echo $? 查看进程退出码 1. 从main返回: main函数return代表进程退出其他的非main函数呢代表的是函数返回 2. 调用exit exit在任意地方调用都代表终止进程参数是退出码它跟main返回一样都会刷新输出缓冲区  在4s之后才刷新输出缓冲区打印输出hello world 3. _exit 终止进程但强制终止进程没有进行进程的后续收尾工作比如刷新缓冲区(用户级缓冲区) 进程退出在操作系统层面做了什么呢 在系统层面少了一个进程释放进程控制块释放进程地址空间释放页表和各种映射关系还有代码和数据也都会被释放掉 三.进程等待 子进程被创建出来是为了完成父进程的某些任务的但是子进程和父进程何时结束这是未知的所以父进程fork之后需要通过wait()/waitpid()等待子进程退出。 为什么要让父进程等待呢 1.通过获取子进程退出的信息能够得知子进程执行结果 2.可以保证时序问题子进程先退出父进程后退出 3.进程退出的时候会先进入僵尸状态会造成内存泄漏问题需要通过父进程wait释放该子进程占用的资源 两个等待函数wait()和waitpid() wait(int* status) 查看Linux进程的相关信息的指令 while :; do ps axj | head -1 ps axj | grep myproc | grep -v grep; sleep 1; echo #####################################;done;  子进程被创建  5秒后子进程终止退出进入僵尸状态 10秒后父进程回收子进程父进程继续执行程序 再过5秒父进程结束  上面这段代码是为了实现在子进程退出之后成为僵尸进程然后父进程继续执行程序回收子进程的信息 waitpid(pid_t pid, int* status, int options): 执行结果跟wait()一样 在上面的代码中waitpid的第一个参数是要等待的那一个进程的pid如果值为-1表示等待任意一个子进程 第二个参数就是 我们通过上面的代码知道当子进程退出码是0的时候父进程从waitpid获取到的状态码是0而子进程退出码是10的时候父进程从waitpid获取到的状态码是2556也就是说父进程拿到什么status结果一定和子进程如何退出是强相关的而我们刚刚知道进程退出时有三种结果那么不难得出最终父进程一定会通过status得到子进程执行的结果 如果程序代码运行完毕结果与否进程就会返回退出码给父进程(通过return / exit)如果代码异常终止本质上时这个进程因为异常问题导致自己收到某种信号 这个status是int类型有32位只使用低16位 父进程首先识别status的低7位终止信号是否为0如果为0表示正常退出否则异常退出若为0继续识别高8位是否为0为0结果正确 验证 tips:退出码(status8)0xFF退出信号status0x7F 代码运行完成 且结果正确的情况 代码运行完成 结果不正确的情况 代码运行过程中收到信号异常退出的情况 判断status的另外一种操作 理解一下waitpid() waitpid()处在用户层和操作系统之间是操作系统提供给用户层的接口在操作系统中僵尸子进程的PCB中保存着进程退出时的退出数据里面包括退出码和退出信号父进程回收该子进程的时候就会将status与退出码和退出信号进行位与运算获取到带有子进程退出时的退出码和退出信号信息的退出状态status然后将status返回给用户 在WaitPid()的第三个参数中0表示阻塞等待WNOHANG表示非阻塞等待 阻塞等待父进程等待子进程退出子进程不退出父进程就会一直等待直到子进程退出。 阻塞了是不是意味着父进程不被调度执行了呢 不会父进程会被链入到等待队列中从R状态变为S状态不会被CPU调度执行直到子进程退出父进程从等待队列中取出然后S状态变为R状态被插入运行队列中被CPU继续调度执行 阻寒的本质: 其实是进程的PCB被放入了等待队列并将进程的状态改为S状态返回的本质: 进程的PCB从等待队列拿到R队列从而被CPU调度 非阻塞等待父进程轮询检测子进程是否退出如果子进程退出查看waitpid检测成功与否如果子进程没有退出就继续轮询检测子进程是否退出 测试代码 执行结果 子进程在执行代码得时候父进程轮询等待期间每轮询一次父进程在做自己的事情。 四.程序替换  4.1为什么要进行程序替换 如果我们想让一个子进程执行一个全新的程序的时候我们就需要程序替换 4.2 什么是程序替换原理是什么 进程不变仅仅替换当前进程得代码和数据得技术叫做进程得程序替换  程序本质上就是存放在磁盘中的文件这些文件程序代码程序数据操作系统将该文件中的代码和数据替换到已存在的进程中的代码和数据这一过程我们称之为程序替换他并没有创建新的进程只是老进程的壳子进程地址空间PCB页表不变把新程序的代码和数据替换进物理内存就可以了 在上面的代码中程序替换之后的的代码是不会执行的 程序替换的本质就是把程序的进程代码数据加载进特定进程的上下文中C/C程序要运行必须得先加载到内存中那么怎么加载呢通过exce*程序替换函数。 在上面的代码中由于进程具有独立性以及写时拷贝的存在虽然父子代码是共享的但是进程程序替换会更改代码区的代码然后发生写时拷贝 执行结果 进程的程序替换的使用 1.现象 2.fork() 3.exec*返回值 4.3 各个程序替换函数的基本使用 替换函数 其实有六种以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[]); 函数解释 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。 如果调用出错则返回-1 所以exec函数只有出错的返回值而没有成功的返回值。 命令理解 l(list) : 表示参数采用列表 v(vector) : 参数用数组 p(path) : 有p自动搜索环境变量PATH e(env) : 表示自己维护环境变量 1.execl(const char* path, const char* arg, ...); 在execl中第一个参数是你的要执行的目标程序的全路径(所在路径/文件名) 第二个参数往后就是要执行的目标程序在命令行上怎么写的这里的参数就怎么一个一个的传递进去最后以NULL结尾 等价于 2.int execlp(const char *file, const char *arg, ...); 在execlp中第一个参数是你的要执行的目标程序的文件名(不带路径会自动去环境变量PATH找该文件) 第二个参数往后就是要执行的目标程序在命令行上怎么写的这里的参数就怎么一个一个的传递进去最后以NULL结尾 3.int execv(const char *path, char *const argv[]); 在execv中第一个参数是你的要执行的目标程序的全路径(所在路径/文件名) 第二个参数是一个命令行参数数组把命令行上写的那些参数一个一个写进这个数组里面 4.int execvp(const char *file, char *const argv[]); 在execv中第一个参数是你的要执行的目标程序的文件名(不带路径会自动去环境变量PATH找该文件) 第二个参数是一个命令行参数数组把命令行上写的那些参数一个一个写进这个数组里面 5.int execle(const char *path, const char *arg, ...,char *const envp[]); 在execlp中第一个参数是你的要执行的目标程序的文件名(不带路径会自动去环境变量PATH找该文件) 第二个参数往后就是要执行的目标程序在命令行上怎么写的这里的参数就怎么一个一个的传递进去最后以NULL结尾 第三个参数是给该程序赋予环境变量 让myproc的子进程执行程序myexe在myproc的子进程中使用execle函数将指定的环境变量给程序myexe然后程序myexe打印出来 6.int execve(const char *path, char *const argv[], char *const envp[]); 在execlp中第一个参数是你的要执行的目标程序的文件名(不带路径会自动去环境变量PATH找该文件) 第二个参数是一个命令行参数数组把命令行上写的那些参数一个一个写进这个数组里面 第三个参数是给该程序赋予环境变量 有了这些函数我们就可以是在C/C中调用其他编程语言的程序了 所有的接口看起来是没有太大差别的只有一个参数的不同 为什么会有这么多接口是为了满足不同的应用场景的 六个函数接口的关系 execve是系统调用函数其他函数都是在该函数的基础上进行的封装 4.4 利用程序替换实现shell命令解释器 在Linux中shell命令行解释器本质上就是一个进程它的名字叫bash我们在命令行中执行的程序的父进程就是它它通过解析我们在命令行上输入的命令字符串然后去环境变量PATH中找到相应的命令程序创建子进程来执行该命令程序最后将结果打印出来。 上面说的是执行第三方命令的时候就会这样操作但是执行内建命令的时候就不需要创建子进程去执行命令而是直接shell进程调用命令函数来执行内建命令 tips:什么是内建命令什么是第三方命令 第三方命令 外部命令有时候也被称为文件系统命令是存在于bash shell之外的程序。外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中。外部命令需要使用子进程来执行。受到环境变量的影响 内建命令 它是shell的一部分执行内建命令等于调用bash shell程序的一个程序它不会受到环境变量的影响内建命令比外部命令效率更高执行更快执行内建命令相当于调用当前 Shell 进程的一个函数。比如cd、exit 这些是内部命令本质是函数调用可以直接使用内建命令并不是某个外部程序而是bash shell该程序的组成部分只要在 bash shell 中就可以运行这个命令。 代码 1 #includestdlib.h2 #includeiostream3 #includeunistd.h4 #includesys/wait.h5 #includesys/types.h6 #includestring.h7 #define NUM 1288 #define CMD_NUM 649 10 int main()11 {12 char command[NUM];//命令字符串13 while(1)14 {15 char* argv[CMD_NUM] {NULL};16 //1.打印提示符17 command[0] 0;//清空字符串;18 std::cout [whomyhostname mysir]# ;19 fflush(stdout);20 //sleep(10);21 22 //2.获取命令字符串23 fgets(command, NUM, stdin);//从命令行获取命令字符串24 command[strlen(command) - 1] 0;25 //std::cout command is: command std::endl;26 27 //3.解析命令字符串char* argv[];28 int cnt 0;29 argv[0] strtok(command, );30 cnt;31 while(argv[cnt] strtok(NULL, ))32 {33 cnt;34 }35 36 //4.执行内建命令相当于调用一个函数 37 if(strcmp(argv[0], cd))38 {39 if(argv[1] ! NULL) chdir(argv[1]);40 continue;41 }42 43 //执行第三方命令44 if(fork() 0)//创建子进程执行第三方命令45 {46 execvp(argv[0], argv);47 //td::cout 执行命令失败 std::endl;48 exit(1);49 }50 waitpid(-1, NULL, 0);51 }52 return 0;53 }
http://www.dnsts.com.cn/news/92579.html

相关文章:

  • 成都网站设计公司哪家好江苏提升关键词排名收费
  • 建立一个网站需要会什么软件网校网站毕业设计的方案
  • 有关学校网站建设策划书网站建设定制开发网站设计开发
  • 莱芜网站优化方案长沙棋牌软件制作开发
  • qq钓鱼网站怎么制作网络商城是什么意思
  • 网站上的地图导航怎么做的赚钱的游戏软件一天赚200元
  • 创业做社交网站公司注册资本需要实缴吗
  • 提高网站规范化建设深圳网站域名
  • 青岛公司建设网站爱是做的电影网站吗
  • 一级a做爰片免网站app编程语言
  • 公司网站建设外包流程重庆网站联盟
  • wordpress 绿色 炫 模板如何进行搜索引擎优化?
  • 食品公司网站建设自己建公司网站可以嘛
  • 网站开发字体的引用推广是怎么做的
  • 长沙移动网站建设起名最好的网站排名
  • 网站建设公司哪家好?怎么做静态网站
  • 怎样做淘宝网站建设网站开发联系方式
  • php蓝色大气科技企业网站住总集团公司宣传册设计样本
  • 公共场所建设网站大连市开发区网站建设公司
  • 快手小程序推广赚钱怎么优化一个网站关键词
  • 石家庄自适应网站建设做化妆品注册和注册的网站
  • 网站建设集团动漫制作专业概念
  • 在建设主题网站时宁波企业名称查询网站
  • 搭建一个网站需要什么一站式网站建设费用
  • 成都网站设计培训竞价在什么网站上做
  • 无锡那家网络公司做网站好建筑设计规范
  • 专业公司网站开发服务wordpress更改主机名
  • 建网站的步骤是哪些wordpress如何开启邀请码注册
  • 宜都网站建设徐州小程序开发商
  • 谷歌网站质量指南快速开发网页工具