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

唐山企业网站建设怀化本地网站

唐山企业网站建设,怀化本地网站,成都环境建设网站,泰国金木棉做网站网站1. 进程创建 1.1 fork函数 #include unistd.h pid_t fork(void); 返回值#xff1a;自进程中返回0#xff0c;父进程返回子进程id#xff0c;出错返回-1 进程调用fork#xff0c;当控制转移到内核中的fork代码后#xff0c;内核会做以下操作 分配新的内存块和…1. 进程创建 1.1 fork函数 #include unistd.h pid_t fork(void); 返回值自进程中返回0父进程返回子进程id出错返回-1 进程调用fork当控制转移到内核中的fork代码后内核会做以下操作  分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork返回开始调度器调度 fork之前父进程独立执行fork之后父子两个执行流分别执行。注意fork之后谁先执行完全由调度器决定。 1.2 写时拷贝 通常父子代码共享父子再不写入时数据也是共享的当任意一方试图写入就以写时拷贝的方式各自一份副本。具体见下图: 1.3 fork常规用法 一个父进程希望复制自己使父子进程同时执行不同的代码段。例如父进程等待客户端请求生成子进程来处理请求。一个进程要执行一个不同的程序。例如子进程从fork返回后调用exec函数。  1.4 fork调用失败的原因 系统中有太多的进程实际用户的进程数超过了限制 2.进程终止 2.1 进程退出场景 正常退出异常退出一个进程只有在正常退出的时候返回值才是有意义的若进程异常退出返回值没有意义 2.2 进程常见退出方法 正常退出 1. 从main返回2. 调用exit3. _exit 2.3 异常退出 收到kill等异常信号执行代码时出现错误操作系统发送信号随后通知的进程 exit函数和_exit函数 #include unistd.h void _exit(int status); void exit(int status); 参数status 定义了进程的终止状态父进程通过wait来获取该值虽然status是int但是仅有低8位可以被父进程所用。所以_exit(-1)时在终端执行$?发现返回值 是255 exit最后也会调用_exit, 但在调用_exit之前还做了其他工作 1. 执行用户通过 atexit或on_exit定义的清理函数。 2. 关闭所有打开的流所有的缓存数据均被写入 3. 调用_exit 2.4 return退出 return是一种更常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当做 exit的参数。 3. 进程等待 3.1意义 子进程退出父进程如果不管不顾就可能造成‘僵尸进程’的问题进而造成内存泄漏。父进程派给子进程的任务完成的如何我们需要知道。如子进程运行完成结果对还是不对 或者是否正常退出。父进程通过进程等待的方式回收子进程资源获取子进程退出信息 3.2 方法 #includesys/types.h #includesys/wait.h pid_t wait(int*status); 返回值成功返回被等待进程pid失败返回-1。 参数输出型参数获取子进程退出状态,不关心则可以设置成为NULL pid_ t waitpid(pid_t pid, int *status, int options); 返回值当正常返回的时候waitpid返回收集到的子进程的进程ID如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在 参数pidPid-1,等待任一个子进程。与wait等效。Pid0.等待其进程ID与pid相等的子进程。status:WIFEXITED(status): 若为正常终止子进程返回的状态则为真。查看进程是否是正常退出WEXITSTATUS(status): 若WIFEXITED非零提取子进程退出码。查看进程的退出码options:WNOHANG: 若pid指定的子进程没有结束则waitpid()函数返回0不予以等待。若正常结束则返回该子进 程的ID。如果子进程已经退出调用wait/waitpid时wait/waitpid会立即返回并且释放资源获得子进程退出信息。如果在任意时刻调用wait/waitpid子进程存在且正常运行则进程可能阻塞。如果不存在该子进程则立即出错返回。 3.3 获取子进程status wait和waitpid都有一个status参数该参数是一个输出型参数由操作系统填充。 如果传递NULL表示不关心子进程的退出状态信息。 否则操作系统会根据该参数将子进程的退出信息反馈给父进程。 status不能简单的当作整形来看待可以当作位图来看待具体细节如下图只研究status低16比特 位 status解引用后是int型变量占据四个字节的内存空间。但它的四个字节并不是都存储着进程的退出返回值。如图所示我们给每个字节从高地址到低地址依次编号1、2、3、4字节。 一个进程退出的场景只有两个 正常退出和异常退出 3.3.1 位运算法 因此在获取返回值之前先通过低七位判断进程是否正常退出 判断是否正常退出如果status 0x7f 0就能判断一个进程是正常退出,否则就是异常退出解释因为异常退出码占用的是4号字节中的低7位因此我们可以通过(*status)和16进制数(0x7f)进行与运算得到异常退出码。 在判断返回值有意义后取出低16位中的高8位取出方法status 8) 0xff的结果解释我想取出低16位中的高8位需要先将status右移8位随后与1111 1111进行按位与得到结果   因为返回值只用了一个字节保存因此进程的返回值最好不要大于255 3.3.2 宏函数 WIFEXITED(status) 等价于 ( (*status)(0x7f) )0 当异常退出码是0宏函数返回true表示进程的退出返回值有意义 WEXITSTATUS(status) 等价于 ( (*status 8)(0xff) )这样直接就可以得到进程的退出返回值。 二进制十进制十六进制的转换方法 教你快速学会二进制、十进制、十六进制之间的转换 - 知乎 (zhihu.com) #include stdio.h #include unistd.h #include stdlib.h #include sys/wait.h int main() {pid_t pid;pid fork();if (pid 0){printf(%s fork error\n, __FUNCTION__);return 1;}else if (pid 0){ // childprintf(child is run, pid is : %d\n, getpid());sleep(5);exit(1);}else{int status 0;pid_t ret 0;do{ret waitpid(-1, status, WNOHANG); // 非阻塞式等待if (ret 0){printf(child is running, i have some task\n);}sleep(1);} while (ret 0);if (WIFEXITED(status) ret pid){printf(wait child 5s success, child return code is :%d.\n, WEXITSTATUS(status));}else{printf(wait child failed, return.\n);return 1;}}return 0; } 4. 进程的程序替换 4.1 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动 例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。 替换函数 其实有六种以exec开头的函数,统称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[]); 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。如果调用出错则返回-1所以exec函数只有出错的返回值而没有成功的返回值。 4.2 命名理解 l(list) : 表示参数采用列表 v(vector) : 参数用数组 p(path) : 有p自动搜索环境变量PATH e(env) : 表示自己维护环境变量#include unistd.h int main() {char *const argv[] {ps, -ef, NULL};char *const envp[] {PATH/bin:/usr/bin, TERMconsole, NULL};execl(/bin/ps, ps, -ef, NULL);// 带p的可以使用环境变量PATH无需写全路径execlp(ps, ps, -ef, NULL);// 带e的需要自己组装环境变量execle(ps, ps, -ef, NULL, envp);execv(/bin/ps, argv);// 带p的可以使用环境变量PATH无需写全路径execvp(ps, argv);// 带e的需要自己组装环境变量execve(/bin/ps, argv, envp);exit(0); } 事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在 man手册第3节。 5. 制作做一个简易的shell
http://www.pierceye.com/news/791738/

相关文章:

  • 2013网站挂马教程长沙网站建设优化
  • 网站搭建详细教程wordpress 找不到主题
  • 陕西省建设厅申报网站大型网站建设公司推荐
  • 企业商城建站外贸建站上海
  • 织梦如何做网站网页设计公司背景
  • 购买域名网站程序员外包公司到底值不值得去
  • 网站出售商品建设广告公司主要做什么
  • 西安的电商网站设计大庆市城乡建设局网站
  • 服装网站建设需要什么内容中国建设银行总行官方网站
  • 免费下载设计素材网站wordpress metaslider
  • 如何建一个自己的网站给网站做rss
  • 宜昌网站制作公司亿腾云优化seo
  • 网站icp备案信息是什么一号网站建设
  • 怎么样做网站徐州市中宇建设工程有限公司网站
  • 网站建站公司官网免费企业网站建设介绍
  • 知名网站建设托管河北建筑工程学院招生信息网
  • 服务器网站建设流程图十堰网站制作公司电话
  • 营销型网站seo开发一个app需要什么技能
  • 网站的欢迎页怎么做织梦网站名称修改
  • 树莓派做博客网站济南抖音推广公司
  • 网站短链接生成济宁网络
  • 组建 网站开发团队交互设计作品集网站
  • 宜春个人网站建设网站建设惠州
  • 医院网站开发兼职wordpress 域名跳转
  • 安监局网站建设wordpress 修改路径
  • 快速搭建网站wordpress成品网站货源入口
  • 信宜手机网站建设公司广州网站建设服务商
  • 网站备案注册3g免费网站制作
  • 做网站需要vps吗建设银行etc的网站是哪个好
  • 网站服务器 2核如何做网站联盟