1 use core::ffi::{c_int, c_void}; 2 3 use crate::{ 4 arch::asm::current::current_pcb, 5 include::bindings::bindings::{pid_t, process_do_exit}, 6 syscall::{Syscall, SystemError}, 7 }; 8 9 extern "C" { c_sys_wait4(pid: pid_t, wstatus: *mut c_int, options: c_int, rusage: *mut c_void) -> c_int10 fn c_sys_wait4(pid: pid_t, wstatus: *mut c_int, options: c_int, rusage: *mut c_void) -> c_int; 11 } 12 13 impl Syscall { 14 #[allow(dead_code)] fork(&self) -> Result<usize, SystemError>15 pub fn fork(&self) -> Result<usize, SystemError> { 16 // 由于进程管理未完成重构,fork调用暂时在arch/x86_64/syscall.rs中调用,以后会移动到这里。 17 todo!() 18 } 19 20 #[allow(dead_code)] vfork(&self) -> Result<usize, SystemError>21 pub fn vfork(&self) -> Result<usize, SystemError> { 22 // 由于进程管理未完成重构,vfork调用暂时在arch/x86_64/syscall.rs中调用,以后会移动到这里。 23 todo!() 24 } 25 26 #[allow(dead_code)] execve( _path: *const c_void, _argv: *const *const c_void, _envp: *const *const c_void, ) -> Result<usize, SystemError>27 pub fn execve( 28 _path: *const c_void, 29 _argv: *const *const c_void, 30 _envp: *const *const c_void, 31 ) -> Result<usize, SystemError> { 32 // 由于进程管理未完成重构,execve调用暂时在arch/x86_64/syscall.rs中调用,以后会移动到这里。 33 todo!() 34 } 35 wait4( pid: pid_t, wstatus: *mut c_int, options: c_int, rusage: *mut c_void, ) -> Result<usize, SystemError>36 pub fn wait4( 37 pid: pid_t, 38 wstatus: *mut c_int, 39 options: c_int, 40 rusage: *mut c_void, 41 ) -> Result<usize, SystemError> { 42 let ret = unsafe { c_sys_wait4(pid, wstatus, options, rusage) }; 43 if (ret as isize) < 0 { 44 return Err( 45 SystemError::from_posix_errno((ret as isize) as i32).expect("wait4: Invalid errno") 46 ); 47 } 48 return Ok(ret as usize); 49 } 50 51 /// # 退出进程 52 /// 53 /// ## 参数 54 /// 55 /// - status: 退出状态 exit(status: usize) -> !56 pub fn exit(status: usize) -> ! { 57 unsafe { process_do_exit(status as u64) }; 58 loop {} 59 } 60 61 /// # 获取进程ID getpid() -> Result<usize, SystemError>62 pub fn getpid() -> Result<usize, SystemError> { 63 return Ok(current_pcb().pid as usize); 64 } 65 } 66