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

成都隆昌网站建设做互联网产品和运营必备的网站

成都隆昌网站建设,做互联网产品和运营必备的网站,网站开发技术笔记,如何最便宜建设一个网站进程控制fork函数进程终止退出码常见的退出方式进程等待什么是进程等待#xff0c;为什么要进程等待阻塞与非阻塞进程替换替换原理替换函数执行系统命令执行自己写的程序模拟实现简易的shellfork函数 fork函数是创建一个子进程#xff0c;之前用过。 #include unistd.h… 进程控制fork函数进程终止退出码常见的退出方式进程等待什么是进程等待为什么要进程等待阻塞与非阻塞进程替换替换原理替换函数执行系统命令执行自己写的程序模拟实现简易的shellfork函数 fork函数是创建一个子进程之前用过。 #include unistd.h pid_t fork(void);返回值自进程中返回0父进程返回子进程id出错返回-1。 进程拥有独立性fork之后就变成了两个程序父子进程共享后边的代码。 那么为什么给父进程返回的就是子进程的pid而给子进程返回的就是0呢 就好比孩子只能有一个亲生的父亲而一个父亲可以拥有很多亲生孩子每个孩子都是独立不同的。 fork函数是在什么时候创建的子进程呢 pid_t fork() {1.创建PCB2.赋值3.创建进程地址空间4.赋值5.创建并设置页表6.子进程放入进程队列//这里才是创建成功一个进程也是分流的地方7.........return pid;//返回的时候核心代码已经执行完毕了 }也就是说fork返回两个值是因为返回之前就已经创建好新进程了。 返回的本质就是写入谁先返回谁先写入id因为进程的独立性然后就会发生写时拷贝。 fork失败的原因 系统拥有太多个进程超过了用户进程的限制就会失败。 进程终止 退出码 在写C/C的时候我们在main函数是程序的开始但是最后一个位置会写return 0 这也就代表一个程序的退出至于为什么要写return 0而不是返回其他的亦或者是不写都可以因为返回uid这个数字是退出码0是正常退出的意思因为正确只有一个不会管你怎么成功但是失败就会找失败的原因再去改正。 echo $?是查看最近进程的退出码上一个写的进程退出码是1再查一次就是echo $?的退出码是0. 退出码可以自定义也可以使用系统的映射关系这里不太推荐。 这个之前用过 然后来看看里面数字对应的错误信息 注意如果程序异常退出码也无意义。 常见的退出方式 上面说了在mian函数中调用return就是进程退出。 C语言和操作系统还提供了两个函数退出进程 这是C语言提供的一个函数只要使用就会退出当前进程参数是退出码。 无论是在哪个位置或者是后面有多少代码。 还有一个系统级别调用的是_exit作用几乎相同 系统调用的并没有打印。 这是C语言提供的过了两秒钟就打印出来了。 这说明 exit 终止进程后会主动刷新缓冲区。 _exit 终止之后不会主动刷新缓冲区。 那么这个缓冲区在哪里呢 exit会刷新缓冲区但是系统不会也就是说位置在系统调用和库函数之间具体的以后说。 进程等待 什么是进程等待为什么要进程等待 之前说过僵尸进程会导致内存泄漏因为他的资源无法回收所以就需要等待子进程结束然后来保存资源给父进程通过获取子进程退出信息知道是否成功退出。 首先来看两个等待进程的函数。 wait/waitpid: status参数是拿该进程的退出结果。 options参数是传入阻塞和非阻塞状态。 pid_t是返回进程的pid返回-1代表失败。 wait 这个程序10-15秒是僵尸进程15s之后就会被回收这个时候子进程就不是僵尸状态了。 waitpid 在举例之前首先说一下status: 一个程序终止有三种情况代码运行完毕结果正确和不正确还有没运行完出异常了。 这个时候status是获取他们这个信息的并且它是拥有自己的位图结构的。 一共有32个比特位其中重要的只有16个比特位 终止信号是一个进程出异常了会受到终止信号暂时用来判断进程是否正常退出。 退出状态是看结果是否正确。 这个是等待的过程其实就是status去PCB找信号和退出码。 总结来说status让操作系统释放掉僵尸状态然后获取进程的退出结果。 但是如果让我们自己去求信号和退出码很麻烦所以Linux提供了一些操作的宏重点说两个 WIFEXITED(status): 若为正常终止子进程返回的状态则为真。查看进程是否是正常退出 WEXITSTATUS(status): 若WIFEXITED非零提取子进程退出码。查看进程的退出码 所以就可以改良成这个样子 结论 进程退出会变成僵尸之后将自己的推出结果放入PCBwait/waitpid是系统调用有资格去读取PCB中的资源。 阻塞与非阻塞 阻塞 父进程一直在等子进程结束回收资源。 非阻塞 父进程一段时间过来看一下子进程是否结束如果没结束可以做其他事情这个叫轮询方式。 WNOHANG: 若pid指定的子进程没有结束则waitpid()函数返回0不予以等待。若正常结束则返回该子进程的ID。 NO1就父进程是不是询问子进程是否退出。 如果在询问之后不子进程没有准备完毕父进程则可以做一些其他的事情。 至于非阻塞和阻塞谁更好这个要看实际场景。 进程替换 之前说过创建子进程的目的是让子进程去帮忙“做事”可是为什么要去让子进程帮忙做事呢 首先说目的 1.想让子进程执行父进程磁盘代码其中的一部分。 2.想让子进程执行一个全新的程序。 替换原理 一个可执行程序被首先被加载到内存中然后执行代码然后代码中有操作让本程序执行一个新程序这个时候就会将指定执行的程序的代码和数据覆盖掉原本的代码和数据在整个过程中并没有产生新的进程这就是为什么每次都要去创建一个子进程来去执行新程序。 替换函数 执行系统命令 这些函数的作用是将指定的程序加载到内存当中让指定的进程执行。 int execl(const char *path, const char *arg, …); 第一个参数是说如何找到程序第二个参数是我们在命令行解释器怎么调用该程序就怎么写最后用NULL结尾。 这几个函数统一的是exec这个函数最后一个l 意思是 list 将参数一个一个传入exec* 这里执行完execl之后后边打印process就不会执行因为整个程序的代码和数据已经被覆盖掉了。 并且这类函数返回值只有-1表示错误。 因为成功之后接下来的代码是不会执行的所以返回一个正确的值进行判断也毫无意义。 int execlp(const char *file, const char *arg, …); 结尾是p的第一个参数不用去指定路径了他会在环境变量PATH进行可执行程序的查找 int execv(const char *path, const char *argv[], …); v是vector的意思第二个参数是让我们把所有可执行参数放入数组中传过去。 int execvp(const char *file, const char *argv[], …); 这个就不演示了这两个参数上面都说过。 上面的只是在执行系统命令那么想执行自己写的程序该怎么办呢 执行自己写的程序 首先来说一下makefile这个文件 先创建一个.c文件 如果我想让test.c去调用process.c首先要生成这两个可执行程序但是makefile只会默认的生成第一个可执行程序后面的就不会再去执行所以我们要这样写 因为是调用程序所以不管是什么语言的程序都可调用。 int execle(const char *path, const char *arg, …,char *const envp[]); 最后一个参数是自定义环境变量的意思。 现在的自定义环境变量还没定义所以为空。 我们发现如果没有自定义环境变量系统自带的环境变量就会被打印但是如果自定义环境变量系统自带的环境变量就不会被打印。 那么如果我两个都想要怎么办呢 这个函数传入你的自定义环境变量就可以了作用就是将你定义的环境变量导入到系统当中。 这里穿插一个问题一个程序运行之前是先调用main还是先调用exec函数呢 是先调用exec函数因为它的作用上面说了是将程序加载到内存中Linux中它就是加载器。 调用exec函数之后会将自己的参数等等传给main函数这就是为什么之前说main函数有三个参数谁传给他的。 int execvpe(const char *file, const char *argv[], …,char *const envp[]); 这个参数就不说了都说过了。 注意上面这些接口都是execve系统调用其他的都是封装为了让我们有更好的选择性。 模拟实现简易的shell 首先来利用main函数的参数来实现一个功能 那么我们可有利用这个模拟实现一个简单的shell。 第一步先设置输入和输出并且创建一个字符数组储存输入的参数。 我们输入一个字符串是abc然后会按回车也就是说实际上是abc\n如果我要在打印信息%s后面加一个\n那么就会多出一行不加容易出现缓冲区不刷新问题所以我们要去除输入末尾的\n。 第二步要进行字符串分割因为我们在屏幕输入的是ls -a -l这种但是exec函数要用到的是字符指针数组类型的所以我们创建一个字符指针数组然后进行分割放进字符指针数组 这里要说一下内建命令我们在输入ls什么的时候不同文件会有颜色但是如果调用exec里面就需要自己添加颜色选项我们又不能在屏幕输入所以只能在代码中添加首先判断一定要是ls命令才行然后添加颜色选项。 像这种不需要让子进程来执行而是shell自己执行的就叫做内建命令。 第三步是打印创建一个子进程帮我们工作这是因为exec函数会替换掉原来程序中所有的代码和数据 然后我们还可以设置一个条件编译来看看字符指针数组中的字符切割是否正确 先来测试一下上面的程序是否正确 但是如果我们输入cd …就会发现根本没有任何变化这是为什么呢 先创建一个其他程序来看一下一个进程的状态 用ls /proc/pid -al cwd是当前进程的工作目录也是我们平时说的当前路径exe是当前程序执行的是磁盘路径的哪一个程序。 那么这个当前路径可以改变嘛通过一个函数是可以的: 谁调用这个函数就更改谁的工作目录参数是更改到哪个目录。 如果更改了工作目录那么以后这个程序再进行创建文件等等操作就会再新的工作目录创建因为系统默认是跟可执行程序同一个目录下去创建新文件。 那么刚才我们的shell不能cd …是因为他只能让当前工作目录发生变化因为shell是通过创建子进程去执行命令我们让目录进行变化的时候是让子进程去帮助执行也就是说改变的其实是子进程的目录和父进程没有任何关系所以说这里还需要创建一个内建命令 之有前还有一个命令是echo $?返回的是最近一次退出码 首先创建两个全局变量保存退出码和信号然后再用他们储存子进程返回的结果 最后进行判断 这里简单的完善一下就可以了主要是综合了上面所说的大部分内容。
http://www.tj-hxxt.cn/news/228824.html

相关文章:

  • 会员视频网站建设张家港做网站收费标准
  • 可以免费做网站推广的平台机械公司简介模板
  • 电商设计网站模板全国工程信息网
  • 网站建设查询php企业网站后台管理系统
  • 电视剧百度风云榜seo自动推广工具
  • 网站建设过程中应该注意的事项有株洲市民健康提醒
  • 长治县网站建设delphi做网站开发
  • 湛江网站建设模板定位工厂网站建设详细的步骤有哪些
  • 部队网站建设报告网站的平面设计图用ps做
  • 公司网站设计专业的seo的五个步骤
  • 做网站好看的背景图片优质手机网站建设哪家好
  • 简易网站制作旅游景点网站模板
  • 广东深圳网站wordpress 杂志
  • 网站描述怎样写大宗贸易采购平台
  • 微商城手机网站制作品牌全案策划案例
  • 做网站好还是阿里巴巴好大连巨人网络推广有限公司
  • 网站建设费用请示黑龙江网站备案查询
  • 可以免费做中考题的网站网站内套网站代码
  • 如何修改网站图片怎么制作网页投票软件
  • 哪个网站是动态谷歌网站推广方案
  • 四川建设厅官方网站是多少广东阳江房产网
  • 网站建设丿找vx cp5173更多标签的适用场景
  • 房产网站建设产品网站版本功能列表
  • 网站顶端图片素材如何制作app的页面
  • 青岛做外贸网站哪家好纯flash网站下载
  • 广州专业制作网站网络推广策略概念
  • 电子商务网站建设详细策划书怎么做宣传网页
  • 网站后台编辑框无法显示苏州建设局网站实名制
  • 南昌餐厅网站建设聊城专业网站制作公司
  • 做网站需要掌握什么相册特效手机网站