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

做网站的工资高host wordpress

做网站的工资高,host wordpress,个人缴纳养老保险,帮客户做网站图片被告侵权标题#xff1a;[Linux] 进程创建、退出和等待 个人主页水墨不写bug #xff08;图片来源于AI#xff09; 目录 一、进程创建fork#xff08;#xff09; 1#xff09; fork的返回值#xff1a; 2#xff09;写时拷贝 ​编辑3#xff09;fork常规用法 4#xff… 标题[Linux] 进程创建、退出和等待 个人主页水墨不写bug 图片来源于AI 目录 一、进程创建fork 1 fork的返回值 2写时拷贝 ​编辑3fork常规用法 4fork调用失败的原因 二、什么是进程退出 1exit()函数于系统调用接口_exit()有什么区别 三、僵尸进程和进程等待 1父进程处理僵尸进程就需要进程等待 2阻塞等待  3非阻塞等待 4输出型参数status 总结 正文开始 一、进程创建fork fork()是Linux操作系统提供的系统调用作用是从一个已经存在的进程中创建一个新进程。新进程为子进程原进程为父进程。 //头文件 #include unistd.h//函数原型 pid_t fork(void);//返回值子进程中返回0父进程返回子进程id出错返回-1 进程调用fork当控制转移到内核中的fork代码后内核做         分配新的内存块和内核数据结构给子进程        将父进程部分数据结构内容拷贝至子进程        添加子进程到系统进程列表当中        fork返回开始调度器调度 具体创建过程的内存图示见《Linux初识进程地址空间》 子进程创建后这里仅仅给出一张图 最重要的是当一个进程调用fork之后就有两个二进制代码相同的进程。而且它们都运行到相同的地方。如下面的例子 #include unistd.h #include stdio.h #include sys/types.hint main() {printf(fork之前 我的pid:%d\n,getpid());pid_t id fork();printf(fork之后 我的pid:%d, fork的返回值:%d\n,getpid(),id);return 0; } 运行之后结果如图 分析         在fork之前只有一个进程pid48247         fork之后父进程pid48247创建出子进程pid48248从父子进程的pid临近和fork给子进程的返回值为0给父进程的返回值为子进程的pid可以看出来。          fork之后父子进程都执行到fork函数这一行于是fork之前的代码不会被执行之后的代码会被父子进程各自执行一次。 1 fork的返回值 给子进程返回0         给父进程返回子进程的pid         如果出错了则子进程没有被创建出来那么给仅有的一个进程父进程返回-1 2写时拷贝 写时拷贝copy-on-write是一种内存管理技术用于优化内存使用和提高性能。它是一种延迟拷贝的策略在创建副本之前共享资源将不会被复制。         写时拷贝的原理是当一个对象需要被拷贝时不会立即进行拷贝操作。而是让新对象与原对象共享同一份资源。当其中一个对象修改了该资源时才会将资源复制到新的对象上。这样可以减少内存的使用避免了不必要的复制操作。 3fork常规用法 一个父进程希望复制自己使父子进程同时执行不同的代码段。例如父进程等待客户端请求生成子进程来处理请求。         一个进程要执行一个不同的程序。例如子进程从fork返回后调用exec函数。进程替换函数 4fork调用失败的原因 系统中有太多的进程         实际用户的进程数超过了限制 二、什么是进程退出 我们在当初学习C语言的时候经常会malloc空间但是动态内存开辟是会有失败的时候malloc的最保险的用法 int size 10;int* arr (int*)malloc(size*sizeof(int));if(arr NULL){perror(malloc fail:);exit(-1);} 如果malloc失败通常是非常严重的错误这个时候进程已经没有必要继续运行下去了这时候选择打印错误信息如果调用exit函数退出。 上述的进程退出只是进程退出的一种场景其实进程想要退出无非只有三种场景 1代码运行完毕 2结果正确代码运行完毕结果不正确 3代码异常终止 当一个进程退出我们在Linux终端可以使用 echo $? 命令查看最近一次进程退出的退出码。 如果最近的一个进程正常退出返回值是0 一个进程退出有什么方式其实无非就是 1从main函数返回         2调用: exit();         3调用系统调用接口:   _exit(); 对于其他的退出方式一般就是我们主动退出ctrlC 或者遇到空指针或者被断言断死其实这些退出方式有一个统称被系统的信号杀死。 1exit()函数于系统调用接口_exit()有什么区别 这两个函数的最本质功能是一样的都是让进程退出但是exit() 函数是对系统调用_exit()函数的封装。 _exit函数是系统调用exit是C语言的库函数。 进程调用_exit()会直接退出但是调用exit会在退出之前做一些善后的处理         1. 执行用户通过 atexit或on_exit定义的清理函数。         2. 关闭所有打开的流所有的缓存数据均被写入刷新缓冲区         3. 调用_exit 三、僵尸进程和进程等待 在Linux系统中僵尸进程Zombie Process是指已经结束执行的进程但是其父进程还没有对其进行完全的清理操作导致进程的资源没有被释放。 僵尸进程的产生是因为操作系统在进程结束时不会立即清理相关的资源而是会将其转变为僵尸进程等待父进程来处理。父进程需要通过调用wait()或waitpid()系统调用来获取子进程的退出状态并对其进行清理释放相应的资源。如果父进程没有处理僵尸进程那么僵尸进程会一直存在于系统中占用系统资源。 僵尸进程通常不会对系统造成直接的危害因为它们已经停止运行。然而如果有大量的僵尸进程存在会浪费系统的进程表资源并可能导致进程表耗尽的问题。此外僵尸进程也可能是父进程出现问题或错误的一个指示比如父进程无法正确处理子进程的退出状态。 1父进程处理僵尸进程就需要进程等待 父进程需要调用wait()/waitpid()等方法等待子进程退出。 2阻塞等待  接口wait():等待任意一个子进程退出但是在等待的过程中父进程什么事都干不了这样的等待称为“阻塞等待”。 //头文件 #includesys/types.h #includesys/wait.hpid_t wait(int*status); //返回值 //成功返回被等待进程pid失败返回-1。//参数 //输出型参数获取子进程退出状态,不关心则可以设置成为NULL 如果想要让父进程在等待的过程中做一些事情就需要另一个接口waitpid() //头文件 #includesys/types.h #includesys/wait.hpid_ t waitpid(pid_t pid, int *status, int options);//返回值 //当正常返回的时候waitpid返回收集到的子进程的进程pid;//如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;//如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;//参数 //pid // Pid -1, 等待任一个子进程,与wait等效。 // Pid 0 . 等待其进程ID与pid相等的子进程。 //status: // WIFEXITED(status): 若为正常终止子进程返回的状态则为真。查看进程是否是正常退出 // WEXITSTATUS(status): 若WIFEXITED非零提取子进程退出码。查看进程的退出码 //options: // WNOHANG: 若pid指定的子进程没有结束则waitpid()函数返回0不予以等待。若正常结束则返回该子进程的ID 3非阻塞等待         waitpid()接口如果设置了MNOHANG那么进程走到这个接口之后会查看一次子进程是否已经退出如果已经退出我们就可根据此时的返回值设置循环的出口         如果没有退出则进程会执行waitpid() 之后的代码逻辑直到下一次循环再次到达waitpid()这个接口处再次查看继续循环。 非阻塞等待实例 void oper() {sleep(1);printf(等待不妨碍做其他事\n); }int main() {pid_t id fork();if(id 0){printf(我是子进程5秒后退出\n);sleep(5);exit(0);}else{int status 0;printf(我是父进程等待子进程退出\n);while(1){pid_t rid waitpid(id,status,WNOHANG);if(rid 0){printf(父进程等到子进程退出\n);break;}oper();}}return 0; } 运行结果 4输出型参数status 什么是输出型参数输出型参数就是我们穿一个参数他的值是由操作系统填充的因此我们在传参的时候需要传地址。 如果传递NULL表示不关心子进程的退出状态信息。 如果传递了status的地址操作系统会根据该参数将子进程的退出信息反馈给父进程。 status不能简单的当作整形来看待需要当作位图来看待具体细节如下图status是32位整形高16位并不携带信息只有status低16比特位携带信息 对于低16位 如果正常退出没有被信号杀掉那么低8位为0次低8位表示退出码这里的退出码就是函数return的返回值也是exit括号内传的值。退出信号的意义是由我们自己赋予的。 如果异常退出进程被信号杀掉退出码虽然可以手动获得但是已经没有意义了因为已经发生重大错误导致进程都没有执行完就退出了 。这时低7位表示进程的退出信号也就是操作系统发送给进程的异常信号。第8位暂时不考虑。 低7位正好是2的七次方64个标识正好对应kill命令给进程发送的终止信号的个数 总结         正常退出次低8位 退出码         异常退出低7位 退出信号 其实为了便于记忆有两个专门对status处理的宏          WIFEXITED:         如果子进程正常退出返回真 WEXITSTATUS         返回status的次低8位退出码。 实例 int main() {pid_t id fork();if(id 0){int* p NULL;*p 10;exit(0);}else{int status 0;wait(status);printf(%d\n,status);if(WIFEXITED(status)){printf(程序正常退出%d\n,WEXITSTATUS(status));}else{printf(程序挂了%d\n,(status0x7f));}}return 0; }运行结果 完~ 未经作者同意禁止转载
http://www.hkea.cn/news/14462822/

相关文章:

  • 暖色调网页设计网站自己画装修设计图的软件
  • 电气网站开发网站建设公司广
  • 优秀网站参考移动网站建设价格便宜
  • 网站设计哪家强软件app下载免费
  • 查看网站外链代码设计图纸平面图
  • 网站的管理和维护精准营销的营销方式
  • 做易经网站网站建设上qq图标去除
  • 做网站为什么选择竞网智赢假发网站是怎么做的
  • 成都微网站公司网络服务商包括
  • 织梦cms做网站教程视频定制网站开发的意思
  • 邢台网站制作的地方通辽市城乡建设局网站
  • 遵义网站设计公司网站运营与管理的内容有哪些
  • flash网站欣赏个人网站cms
  • 网站模板 外贸工厂php 开源的企业网站
  • 企业网站配色绿色配什么色合适网站备案怎么查询
  • wordpress nginx gzip吐鲁番seo招聘
  • 网站建设维护费一年多少钱公司介绍50字
  • 玉田网站设计公司php网站开发的技术框架
  • 网站建设招标样本比wordpress好用
  • 北京网站开发联系电话策划公司职位
  • 网站改版协议云南网络推广服务
  • 最超值的郑州网站建设网店seo排名优化
  • 什么是网站后台建设住房和城建设网站
  • 网站网页设计的意义网站备案取消
  • dede免费手机网站模板.天津网站建设
  • wordpress网站在线安装企业电子商务网站平台建设
  • 哪些网站做英语比较好普通网站建设费用
  • 如何域名解析网站建设重庆市建立网站的网络公司
  • 用dw做的代码怎么放在网站上wordpress数据库文件
  • asp网站打开上海哪家seo好