#![no_std]
#![no_main]

use user_lib::syscall::{sys_fork, sys_yield, sys_exec};
use user_lib::{println, wait};

#[no_mangle]
fn main() -> i32 {
    if sys_fork() == 0 {
        // 注意需要手动添加\0 转为 c_str
        // 启动我们的shell程序
        sys_exec("user_shell\0");
    } else {
        // 所有的进程 最后父进程都会是 initproc进程, 所以我们这里一直等待 子进程是否结束
        // 持续调用wait 进行等待,
        loop {
            let mut exit_code: i32 = 0;
            let pid = wait(&mut exit_code);
            //如果 没有进程被回收 则让出cpu, 开始下一轮循环
            if pid == -1 {
                sys_yield();
                continue;
            }
            println!(
                "[initproc] Released a zombie process, pid={}, exit_code={}",
                pid, exit_code,
            );
        }
    }
    0
}
