From d0af7d26be53e3df2b3c832e16e7e559dabb7b7d Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Thu, 10 Dec 2020 14:51:50 +0800 Subject: [PATCH] Avoid panicking when inputting error app name; List all apps when initializing. --- os/src/loader.rs | 9 +++++++++ os/src/main.rs | 1 + os/src/syscall/process.rs | 11 +++++++---- user/src/bin/user_shell.rs | 4 ++-- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/os/src/loader.rs b/os/src/loader.rs index 4f10ab6..d49cf69 100644 --- a/os/src/loader.rs +++ b/os/src/loader.rs @@ -51,3 +51,12 @@ fn app_names() -> Vec<&'static str> { } v } + +pub fn list_apps() { + let apps = app_names(); + println!("/**** APPS ****"); + for app in apps { + println!("{}", app); + } + println!("**************/") +} \ No newline at end of file diff --git a/os/src/main.rs b/os/src/main.rs index 78c08e2..3b3eef9 100644 --- a/os/src/main.rs +++ b/os/src/main.rs @@ -46,6 +46,7 @@ pub fn rust_main() -> ! { trap::init(); trap::enable_timer_interrupt(); timer::set_next_trigger(); + loader::list_apps(); task::run_tasks(); panic!("Unreachable in rust_main!"); } \ No newline at end of file diff --git a/os/src/syscall/process.rs b/os/src/syscall/process.rs index 656837e..ca5d6c8 100644 --- a/os/src/syscall/process.rs +++ b/os/src/syscall/process.rs @@ -59,10 +59,13 @@ pub fn sys_fork() -> isize { pub fn sys_exec(path: *const u8) -> isize { let token = current_user_token(); let path = translated_str(token, path); - let data = get_app_data_by_name(path.as_str()).unwrap(); - let task = current_task().unwrap(); - task.exec(data); - 0 + if let Some(data) = get_app_data_by_name(path.as_str()) { + let task = current_task().unwrap(); + task.exec(data); + 0 + } else { + -1 + } } pub fn sys_waitpid(pid: isize, exit_code_ptr: *mut i32) -> isize { diff --git a/user/src/bin/user_shell.rs b/user/src/bin/user_shell.rs index 3c59f12..b871ea7 100644 --- a/user/src/bin/user_shell.rs +++ b/user/src/bin/user_shell.rs @@ -31,13 +31,13 @@ pub fn main() -> i32 { if pid == 0 { // child process if exec(line.as_str()) == -1 { - println!("Command not found!"); + println!("Error when executing!"); return 0; } unreachable!(); } else { let mut xstate: i32 = 0; - let mut exit_pid: isize = 0; + let mut exit_pid: isize; loop { exit_pid = waitpid(pid as usize, &mut xstate); if exit_pid == -1 {