stdio.rs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. use system_error::SystemError;
  2. use crate::{
  3. driver::tty::virtual_terminal::vc_manager,
  4. filesystem::vfs::{
  5. file::{File, FileMode},
  6. ROOT_INODE,
  7. },
  8. process::{Pid, ProcessManager},
  9. };
  10. /// @brief 初始化pid=1的进程的stdio
  11. pub fn stdio_init() -> Result<(), SystemError> {
  12. if ProcessManager::current_pcb().pid() != Pid(1) {
  13. return Err(SystemError::EPERM);
  14. }
  15. let tty_path = format!(
  16. "/dev/{}",
  17. vc_manager()
  18. .current_vc_tty_name()
  19. .expect("Init stdio: can't get tty name")
  20. );
  21. let tty_inode = ROOT_INODE()
  22. .lookup(&tty_path)
  23. .unwrap_or_else(|_| panic!("Init stdio: can't find {}", tty_path));
  24. let stdin =
  25. File::new(tty_inode.clone(), FileMode::O_RDONLY).expect("Init stdio: can't create stdin");
  26. let stdout =
  27. File::new(tty_inode.clone(), FileMode::O_WRONLY).expect("Init stdio: can't create stdout");
  28. let stderr = File::new(tty_inode.clone(), FileMode::O_WRONLY | FileMode::O_SYNC)
  29. .expect("Init stdio: can't create stderr");
  30. /*
  31. 按照规定,进程的文件描述符数组的前三个位置,分别是stdin, stdout, stderr
  32. */
  33. assert_eq!(
  34. ProcessManager::current_pcb()
  35. .fd_table()
  36. .write()
  37. .alloc_fd(stdin, None)
  38. .unwrap(),
  39. 0
  40. );
  41. assert_eq!(
  42. ProcessManager::current_pcb()
  43. .fd_table()
  44. .write()
  45. .alloc_fd(stdout, None)
  46. .unwrap(),
  47. 1
  48. );
  49. assert_eq!(
  50. ProcessManager::current_pcb()
  51. .fd_table()
  52. .write()
  53. .alloc_fd(stderr, None)
  54. .unwrap(),
  55. 2
  56. );
  57. return Ok(());
  58. }