Linux的exit()是进程退出用的,wait()则是父进程用来回收已退出的子进程的资源的。
进程已经调用了exit()退出,而父进程还没有调用wait()回收资源的状态,就是僵尸状态(task zombie)。这时该进程已经不能运行,但还占着待回收资源。
先看看这两个函数的man手册介绍,
exit的参数是退出状态码,一般正常退出传0,出错退出传-1,无返回值,因为进程调用了exit()之后就不再返回了。
wait的参数是返回子进程退出状态的指针,是个传出参数,返回值是wait到的子进程的pid。
这两个模拟一下。
先给我们的task_t加两个成员变量,exit_code表示进程的退出码,status表示进程的运行状态。
把他们加在结构体的尾部,这样不会影响到之前变量的偏移量。
定义两个进程状态,TASK_RUN和TASK_ZOMBIE,只有TASK_RUN时才可以被调度执行。
定义SIG_CHILD信号,在子进程退出时发送给父进程。