sys_vfork.rs 1.3 KB

12345678910111213141516171819202122232425262728293031323334
  1. use crate::arch::interrupt::TrapFrame;
  2. use crate::arch::syscall::nr::SYS_VFORK;
  3. use crate::process::fork::CloneFlags;
  4. use crate::process::ProcessManager;
  5. use crate::syscall::table::{FormattedSyscallParam, Syscall};
  6. use alloc::vec::Vec;
  7. use system_error::SystemError;
  8. pub struct SysVfork;
  9. impl Syscall for SysVfork {
  10. fn num_args(&self) -> usize {
  11. 0
  12. }
  13. fn handle(&self, _args: &[usize], frame: &mut TrapFrame) -> Result<usize, SystemError> {
  14. // 由于Linux vfork需要保证子进程先运行(除非子进程调用execve或者exit),
  15. // 而我们目前没有实现这个特性,所以暂时使用fork代替vfork(linux文档表示这样也是也可以的)
  16. ProcessManager::fork(frame, CloneFlags::empty()).map(|pid| pid.into())
  17. // 下面是以前的实现,除非我们实现了子进程先运行的特性,否则不要使用,不然会导致父进程数据损坏
  18. // ProcessManager::fork(
  19. // frame,
  20. // CloneFlags::CLONE_VM | CloneFlags::CLONE_FS | CloneFlags::CLONE_SIGNAL,
  21. // )
  22. // .map(|pid| pid.into())
  23. }
  24. fn entry_format(&self, _args: &[usize]) -> Vec<FormattedSyscallParam> {
  25. vec![]
  26. }
  27. }
  28. syscall_table_macros::declare_syscall!(SYS_VFORK, SysVfork);