seo诊断站长,专业做包装的电商网站,深圳保障性住房可以买卖吗,投资做网站利润分析目录
一#xff0c;僵尸进程
1#xff0c;僵尸进程
2#xff0c;僵尸进程的危害
二#xff0c;孤儿进程
1#xff0c;孤儿进程
三#xff0c;进程等待
1#xff0c;进程等待的必要性
2#xff0c;wait 方法
3#xff0c;waitpid 方法
4#xff0c;回收小结…目录
一僵尸进程
1僵尸进程
2僵尸进程的危害
二孤儿进程
1孤儿进程
三进程等待
1进程等待的必要性
2wait 方法
3waitpid 方法
4回收小结 一僵尸进程 1僵尸进程 僵死状态Zombies是一个比较特殊的状态。 当进程退出并且父进程使用wait()系统调用,后面讲 没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 僵死进程会以终止状态保持在进程表中并且会一直在等待父进程读取退出状态代码。 所以只要子进程退出父进程还在运行但父进程没有读取子进程状态子进程进入Z状态 来一个创建维持30秒的僵死进程例子
#include stdio.h
#include stdlib.h
int main()
{pid_t id fork();if (id 0) {perror(fork);return 1;}else if (id 0) { //parentprintf(parent[%d] is sleeping...\n, getpid());sleep(30);}else {printf(child[%d] is begin Z...\n, getpid());sleep(5);exit(EXIT_SUCCESS);}return 0;
} 当fork函数返回值父进程和子进程同时启动当子进程运行结束退出进程时父进程还在等待此时子进程一直在等待父进程读取其退出状态代码于是产生了僵尸状态
僵尸状体会造成内存泄漏我们要尽可能避免 2僵尸进程的危害
进程的退出状态必须被维持下去因为他要告诉关心它的进程父进程你交给我的任务我办的怎么样了。可父进程如果一直不读取那子进程就一直处于Z状态是的
维护退出状态本身就是要用数据维护也属于进程基本信息所以保存在task_struct(PCB)中换句话说Z状态一直不退出PCB一直都要维护是的
那一个父进程创建了很多子进程就是不回收是不是就会造成内存资源的浪费是的因为数据结构对象本身就要占用内存想想C中定义一个结构体变量对象是要在内存的某个位置进行开辟空间
内存泄漏?是的 二孤儿进程 1孤儿进程 父进程如果提前退出那么子进程后退出进入Z之后那该如何处理呢 父进程先退出子进程就称之为“孤儿进程” 孤儿进程被1号init进程领养当然要有init进程回收喽。 我们写一个进程来感受一下
#include stdio.h
#include unistd.h
#include stdlib.h
int main()
{pid_t id fork();if (id 0) {perror(fork);return 1;}else if (id 0) {//childprintf(I am child, pid : %d\n, getpid());sleep(10);}else {//parentprintf(I am parent, pid: %d\n, getpid());sleep(3);exit(0);}return 0;
} fork()函数返回后子进程和父进程同时运行当父进程执行结束并且退出后子进程还在运行此时子进程沦为孤儿
一般孤儿进程最后会被1号init进程领养不会造成内存泄漏 三进程等待 1进程等待的必要性 之前讲过子进程退出父进程如果不管不顾就可能造成‘僵尸进程’的问题进而造成内存泄漏。 另外进程一旦变成僵尸状态那就刀枪不入“杀人不眨眼”的kill -9 也无能为力因为谁也没有办法杀死一个已经死去的进程。 最后父进程派给子进程的任务完成的如何我们需要知道。如子进程运行完成结果对还是不对 或者是否正常退出。 父进程通过进程等待的方式回收子进程资源获取子进程退出信息 2wait 方法 pid_t wait(int*status); 返回值 成功返回被等待进程pid失败返回-1。 参数 输出型参数获取子进程退出状态,不关心则可以设置成为NULL #include stdio. h
#include unistd.h
#include stdlib.h
#includesys/types.h
#includesys / wait.h
int main()
{pid_t id fork();if (id 0) {perror(fork);return 1;}else if (id 0) {//parentprintf(child[%d] is sleeping...\n, getpid());sleep(5);exit(3);}int status 0;pid_t rid wait(status);if (rid 0){printf(parent[%d] is begin Z...\n, rid);sleep(10);}else {printf(进程失败:rid:%d\n, rid);}return 0;} 这样子 wait 会自动及时回收子进程不会形成僵尸不会造成内存泄漏 3waitpid 方法 pid_ t waitpid(pid_t pid, int *status, int options); 返回值 当正常返回的时候waitpid返回收集到的子进程的进程ID 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在 参数 pid Pid-1,等待任一个子进程。与wait等效。 Pid0.等待其进程ID与pid相等的子进程。 status: WIFEXITED(status): 若为正常终止子进程返回的状态则为真。 查看进程是否是正常退出 WEXITSTATUS(status): 若WIFEXITED非零提取子进程退出码。查看进程的退出码 options: WNOHANG: 若pid指定的子进程没有结束则waitpid()函数返回0不予以等待。若正常结束则返回该子进 程的ID。 #include stdio. h
#include unistd.h
#include stdlib.h
#includesys/types.h
#includesys / wait.h
int main()
{pid_t id fork();if (id 0) {perror(fork);return 1;}else if (id 0) {//parentprintf(child[%d] is sleeping...\n, getpid());sleep(5);exit(3);}int status 0;pid_ t rid waitpid(-1,status,0);if (rid 0){printf(parent[%d] is begin Z...\n, rid);sleep(10);}else {printf(进程失败:rid:%d\n, rid);}return 0;} 4回收小结 如果子进程已经退出调用wait/waitpid时wait/waitpid 会立即返回并且释放资源获得子进程退出信息。 如果在任意时刻调用 wait/waitpid子进程存在且正常运行则进程可能阻塞。 如果不存在该子进程则立即出错返回。