From 865f4ba4cdce23b154844d6d297f75033f3dcf70 Mon Sep 17 00:00:00 2001 From: GnoCiYeH Date: Mon, 9 Oct 2023 01:10:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9shell=E6=89=A7=E8=A1=8Cexec?= =?UTF-8?q?=E6=97=B6=E4=BC=A0=E5=8F=82=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20(#399)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修改shell执行exec时传参错误问题 --- kernel/src/process/exec.rs | 4 +++- kernel/src/process/mod.rs | 4 ++-- user/apps/shell/cmd.c | 7 ++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/kernel/src/process/exec.rs b/kernel/src/process/exec.rs index 9a169e91..0a5805c6 100644 --- a/kernel/src/process/exec.rs +++ b/kernel/src/process/exec.rs @@ -197,6 +197,7 @@ pub fn load_binary_file(param: &mut ExecParam) -> Result, pub envs: Vec, pub auxv: BTreeMap, @@ -205,6 +206,7 @@ pub struct ProcInitInfo { impl ProcInitInfo { pub fn new() -> Self { Self { + proc_name: String::new(), args: Vec::new(), envs: Vec::new(), auxv: BTreeMap::new(), @@ -222,7 +224,7 @@ impl ProcInitInfo { ustack: &mut UserStack, ) -> Result<(VirtAddr, VirtAddr), SystemError> { // 先把程序的名称压入栈中 - self.push_str(ustack, self.args[0].as_str())?; + self.push_str(ustack, &self.proc_name)?; // 然后把环境变量压入栈中 let envps = self diff --git a/kernel/src/process/mod.rs b/kernel/src/process/mod.rs index 496a4a15..cd4baf0b 100644 --- a/kernel/src/process/mod.rs +++ b/kernel/src/process/mod.rs @@ -630,8 +630,8 @@ impl ProcessControlBlock { } /// 生成进程的名字 - pub fn generate_name(_program_path: &str, args: &Vec) -> String { - let mut name = "".to_string(); + pub fn generate_name(program_path: &str, args: &Vec) -> String { + let mut name = program_path.to_string(); for arg in args { name.push_str(arg); name.push(' '); diff --git a/user/apps/shell/cmd.c b/user/apps/shell/cmd.c index 8b5ea8f8..ebeadee7 100644 --- a/user/apps/shell/cmd.c +++ b/user/apps/shell/cmd.c @@ -508,7 +508,12 @@ int shell_cmd_exec(int argc, char **argv) char *file_path = get_target_filepath(argv[1], &path_len); // printf("before execv, path=%s, argc=%d\n", file_path, argc); - execv(file_path, argv); + char **real_argv; + if (argc > 2) + { + real_argv = &argv[2]; + } + execv(file_path, real_argv); // printf("after execv, path=%s, argc=%d\n", file_path, argc); free(argv); free(file_path);