mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-09 19:36:47 +00:00
parent
b7b843bedd
commit
865f4ba4cd
@ -197,6 +197,7 @@ pub fn load_binary_file(param: &mut ExecParam) -> Result<BinaryLoaderResult, Sys
|
|||||||
/// 程序初始化信息,这些信息会被压入用户栈中
|
/// 程序初始化信息,这些信息会被压入用户栈中
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ProcInitInfo {
|
pub struct ProcInitInfo {
|
||||||
|
pub proc_name: String,
|
||||||
pub args: Vec<String>,
|
pub args: Vec<String>,
|
||||||
pub envs: Vec<String>,
|
pub envs: Vec<String>,
|
||||||
pub auxv: BTreeMap<u8, usize>,
|
pub auxv: BTreeMap<u8, usize>,
|
||||||
@ -205,6 +206,7 @@ pub struct ProcInitInfo {
|
|||||||
impl ProcInitInfo {
|
impl ProcInitInfo {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
proc_name: String::new(),
|
||||||
args: Vec::new(),
|
args: Vec::new(),
|
||||||
envs: Vec::new(),
|
envs: Vec::new(),
|
||||||
auxv: BTreeMap::new(),
|
auxv: BTreeMap::new(),
|
||||||
@ -222,7 +224,7 @@ impl ProcInitInfo {
|
|||||||
ustack: &mut UserStack,
|
ustack: &mut UserStack,
|
||||||
) -> Result<(VirtAddr, VirtAddr), SystemError> {
|
) -> Result<(VirtAddr, VirtAddr), SystemError> {
|
||||||
// 先把程序的名称压入栈中
|
// 先把程序的名称压入栈中
|
||||||
self.push_str(ustack, self.args[0].as_str())?;
|
self.push_str(ustack, &self.proc_name)?;
|
||||||
|
|
||||||
// 然后把环境变量压入栈中
|
// 然后把环境变量压入栈中
|
||||||
let envps = self
|
let envps = self
|
||||||
|
@ -630,8 +630,8 @@ impl ProcessControlBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// 生成进程的名字
|
/// 生成进程的名字
|
||||||
pub fn generate_name(_program_path: &str, args: &Vec<String>) -> String {
|
pub fn generate_name(program_path: &str, args: &Vec<String>) -> String {
|
||||||
let mut name = "".to_string();
|
let mut name = program_path.to_string();
|
||||||
for arg in args {
|
for arg in args {
|
||||||
name.push_str(arg);
|
name.push_str(arg);
|
||||||
name.push(' ');
|
name.push(' ');
|
||||||
|
@ -508,7 +508,12 @@ int shell_cmd_exec(int argc, char **argv)
|
|||||||
char *file_path = get_target_filepath(argv[1], &path_len);
|
char *file_path = get_target_filepath(argv[1], &path_len);
|
||||||
// printf("before execv, path=%s, argc=%d\n", file_path, argc);
|
// 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);
|
// printf("after execv, path=%s, argc=%d\n", file_path, argc);
|
||||||
free(argv);
|
free(argv);
|
||||||
free(file_path);
|
free(file_path);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user