进程的诞生和消亡及wait函数的使用

1.进程的诞生
(1)进程0(内核态)和进程1(init进程)
(2)fork
(3)vfork

2.进程的消亡
(1)正常终止和异常终止
(2)进程在运行时需要消耗系统资源(内存、IO),进程终止时理应完全释放这些资源(如果进程消亡后任没有释放相应的资源则这些资源就丢失了)
(3)linux设计规定;每个进程退出时,操作系统会自动回收这个进程涉及到的所有资源(譬如malloc申请的内存没有free时,当进程结束会释放这个内存),但操作系统只是回收了这个进程工作时消耗的内存和IO,而且没有回收这个进程本身占用的内存。(8kb,主要是task_struct和栈内存)
(4)因为进程本身的8kb内存操作系统不能回收,因此每个进程都需要这个进程的父进程来帮他回收。

3.僵尸进程
(1)子进程先于父进程结束。子进程结束后父进程此时并不一定立即能帮子进程“收尸”,这一段时间就是僵尸进程。
(2)子进程除task_struct和栈外其余内存皆是自己清理
(3)父进程可以使用wait和waitpid以显示回收子进程的剩余待回收内存资源并获取子进程退出状态。
(4)父进程也可以不使用这两个函数,此时父进程结束时父进程一样会回收子进程的剩余待回收内存资源。(前提子进程先结束,父进程结束时),这样是为了防止父进程忘记显示调用wait/waitpid来回收子进程从而造成内存泄露。

4.孤儿进程
(1)父进程先于子进程结束,子进程就变成了孤儿进程
(2)linux规定所有孤儿进程都会自动成为进程1(init进程)的子进程。

5.父进程wait回收子进程
(1)子进程结束时,系统向父进程发送SIGCHILD信号
(2)父进程调用wait函数后阻塞
(3)父进程被SIGCHILD信号唤醒然后去回收僵尸子进程
(4)父子进程之间的通信是异步的,SIGCHILD信号就是为了解决父子进程之间的异步通信问题,让父进程可以及时回收僵尸进程。
(5)若父进程没有任何子进程则wait返回错误

6.wait实战编程

pid_t wait(int *wstatus);

(1)wait的参数status,status用来返回子进程结束状态,父进程通过wait得到status后就遭到子进程的结束状态信息。
(2)wait的返回值pid_t,本次wait回收的子进程的PID,当前进程有可能有多个子进程,wait函数阻塞直到其中一个子进程结束wait就会返回,wait的返回值就可以知道社那个子进程被回收了。
(3)fork后wait回收实例

(4)WIFEXITED(子进程是否正常终止正常终止返回1,return、exit、_exit退出)、WEXITSTATUS(用来获取正常终止的终止值)、WIFSIGNALED(判断是否非正常终止就是被信号终止)

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main(void)
{
        pid_t pid = -1;
        pid_t ret = -1;
        int status = -1;

        pid = fork();
        if(pid > 0)
        {
                //pid_t wait(int *wstatus);
                ret = wait(&status);    //如果父进程先执行到这里就会被阻塞等待SIGCHILD信号
                printf("子进程已经被回收,子进程的pid = %d\n",ret);
                printf("子进程是否正常退出:%d\n",WIFEXITED(status));
                printf("子进程是否正常退出:%d\n",WIFSIGNALED(status));
                printf("子进程正常终止的终止值:%d\n",WEXITSTATUS(status));
        }
        else if(pid == 0)
        {
                printf("child pid = %d\n",getpid());
                //return 1;
                exit(2);
                //while(1);
        }
        else
        {
                perror("fork");
                return -1;
        }

        return 0;
}

结果展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值