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

北京营业执照网上办理入口如何做seo优化

北京营业执照网上办理入口,如何做seo优化,网页网站免费,装修公司做网站好做吗Q:父进程为什么要等待子进程退出? A:回顾创建子进程的目的,就是让子进程去处理一些事情,那么“事情干完了没有”这件事,父进程需要知道并收集子进程的退出状态。子进程的退出状态如果不被收集,…

Q:父进程为什么要等待子进程退出?

A:回顾创建子进程的目的,就是让子进程去处理一些事情,那么“事情干完了没有”这件事,父进程需要知道并收集子进程的退出状态子进程的退出状态如果不被收集,就会变成僵尸进程而如果父进程在子进程之前就退出了,则此时的子进程会变成孤儿进程。

而父进程会通过下面几个宏来解析具体返回的状态码:

 

僵尸进程

其实上上节的demo2的代码就会产生僵尸进程,因为父进程没有收集子进程的退出状态:

demo2.c:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>int main()
{pid_t pid;pid_t fork_return;int cnt = 0;pid = getpid();printf("before fork, PID = %d\n",pid);fork_return = vfork();if(fork_return > 0){while(1){printf("This is the father JC,PID = %d\n",getpid());sleep(2);}}else{while(1){printf("This is the son JC,PID = %d\n",getpid());sleep(2);cnt++;if(cnt == 3){exit(-1);}}}return 0;
}

运行效果:

看起来似乎运行效果很对,但如果使用"ps -aux|grep zombie"查看进程就会发现,PID号为3126的子进程已经变成了僵尸进程

“ S+ ”代表 进程正在正常运行中

“ Z+ ”代表 僵尸进程

孤儿进程 

Linux为了避免系统存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。

修改demo2.c:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>int main()
{pid_t pid;pid_t fork_return;int cnt;pid = getpid();printf("before fork, PID = %d\n",pid);fork_return = fork();if(fork_return > 0){printf("This is the father JC,PID = %d\n",getpid());}else{while(1){printf("This is the son JC,PID = %d, my father JS's PID = %d\n",getpid(),getppid());sleep(2);cnt++;if(cnt == 3){exit(1);}}}return 0;
}

运行效果:

可见,父亲打印一条消息就会去世,在去世前,子进程的父亲就是原来程序的PID,但是当父亲离开后,子进程被PID为1797的进程收养了

通过“ps -aux” 查找1797:

但是根据概念,子进程不应该被PID号为1的进程收养吗?原因看这里:

父进程终止,子进程未被init收养问题_抱走♡的博客-CSDN博客 

所以是Linux的系统版本导致的问题应该= =

 

wait相关函数 

需要添加的库:

#include <sys/types.h>
#include <sys/wait.h>

wait函数原型:

 pid_t wait(int *wstatus);

参数说明1:

  • wstatus:这是一个整数型指针,如果设置为“NULL”,则表示不关心退出的状态如果不设置为“NULL”,则子进程退出的状态会放在这个指针指向的地址中

 

waitpid函数原型: 

waitpid和wait的区别就是,wait函数调用后在子进程退出前父进程会被强制阻塞而waitpid中有一个参数可以使得父进程不被阻塞。

pid_t waitpid(pid_t pid, int *wstatus, int options);

参数说明2:

  • pid:

  • wstatus:这是一个整数型指针,如果设置为“NULL”,则表示不关心退出的状态如果不设置为“NULL”,则子进程退出的状态会放在这个指针指向的地址中
  • options:

  1.  option如果设置为“WNOHANG”,则 若由PID指定的子进程不是立刻可用的,则waitpid不阻塞,此时其返回值为0
  2.  option如果设置为“WUNTRACED”,则 若某实现支持作业控制,而由PID指定的任一子进程已处于暂停状态,并且其状态自暂停以来还未报告过,则返回其状态,WIFSTOPPED宏确定返回值是否对应于一个暂停子进程
  3.  option如果设置为“WCONTINUED”,则 若实现支持作业控制,那么由PID指定的任一子进程在暂停后已经继续,但其状态尚未报告,则返回其状态(POSIX.1的XSI拓展)

 

父进程等待退出并收集状态的演示

demo3.c:

使用wait函数,并将wstatus设置为NULL:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{pid_t pid;pid_t fork_return;int cnt = 0;pid = getpid();printf("before fork, PID = %d\n",pid);fork_return = fork();if(fork_return > 0){wait(NULL);while(1){printf("This is the father JC,PID = %d\n",getpid());sleep(2);}}else{while(1){printf("This is the son JC,PID = %d\n",getpid());sleep(2);cnt++;if(cnt == 3){exit(1);}}}return 0;
}

实现效果1:

 

可见虽然使用的是fork函数而不是vfork,但是由于父进程调用了wait函数,所以在子进程运行时一直阻塞,直到子进程退出,父进程才开始执行。

使用"ps -aux|grep demo3-1"查看进程:

可见,此时PID为3056的子进程已经完全退出,所以没有之前出现的僵尸进程了。 

使用wait函数,并不将wstatus设为NULL:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{pid_t pid;pid_t fork_return;int cnt = 0;int status = 0;pid = getpid();printf("before fork, PID = %d\n",pid);fork_return = fork();if(fork_return > 0){wait(&status);printf("child quit, exit status = %d\n",WIFEXITED(status));while(1){printf("This is the father JC,PID = %d\n",getpid());sleep(2);}}else{while(1){printf("This is the son JC,PID = %d\n",getpid());sleep(2);cnt++;if(cnt == 3){exit(1);}}}return 0;
}

注意,由于此时的子进程是正常退出则刚刚提到的宏“WIFEXITED”的值为真,并且可以使用 “WEXITSTATUS” 来解析状态,才可以得到正确的值

实现效果2:

可见,此时在子进程正常退出后,父进程在运行前还得到了子进程退出时的状态码

使用"ps -aux|grep demo3-2"查看进程:

可见,PID号为3109的子进程已经退出

 

demo4.c:

使用waitpid函数,并将option设为“WNOHANG”:

waitpid(fork_return,&status,WNOHANG);

回顾刚刚讲的PID参数如果>0,则等待“进程号等于这个PID”的子进程,而之前就说过fork的返回值就是子进程的PID,所以在这里直接将第一个参数设置为fork_return

实现效果:

可见,这次父进程没有阻塞并且直接返回,然后父子进程开始抢占CPU,等子进程成功执行三次退出之后,再次变成只有父进程在执行了。

 但是此时,使用"ps -aux|grep a.out"查看进程:

可见: PID号为3254的子进程变成了一个僵尸进程

所以,父进程的非阻塞等待会造成子进程变成僵尸进程!

 

 

http://www.mmbaike.com/news/33249.html

相关文章:

  • 台州网站快速优化排名易搜搜索引擎
  • 广东网络品牌建站公司北京快速优化排名
  • 一流设计网站电脑培训班价目表
  • 网站群建设规划方案b站视频未能成功转码
  • 做书的网站有哪些友情连接出售
  • 企业网站seo哪里好潮州seo
  • 买域名和服务器做自己的网站新媒体营销案例ppt
  • dede关闭手机网站关键词优化步骤简短
  • 自己做网站卖东西犯法吗看颜色应该搜索哪些词汇
  • 龙华做网站yihe kj目前最火的推广平台
  • 公司网站管理百度搜索关键词技巧
  • 深圳教育平台网站建设网盘搜索神器
  • 中央经济工作会议全文seo销售话术开场白
  • 怎样在网站做视频链接seo优化内容
  • 做公司网站职业培训网络平台
  • 合肥做淘宝网站建设最新今日头条
  • 易语言做网站教程网站快速收录入口
  • 外国网站 dns解析失败对网站的建议和优化
  • wordpress 多语言建站2022今天刚刚发生地震了
  • wordpress 汉化版主题网络seo首页
  • 网站建设进度怎么做产品推广平台
  • 政府网站改版建设建议企业培训有哪些方面
  • 抖音带运营是怎么回事seo排名赚
  • 网站被host重定向深圳网络seo推广
  • wordpress rtl.csszac博客seo
  • 做骗子曝光网站是否违法google play谷歌商店
  • 最好的网站建设系统百度小程序seo
  • 可靠的微商城网站建设自媒体是什么
  • 建一个公司网站要多少钱自媒体运营
  • 东莞家政网站建设考研培训班哪个机构比较好