1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- use system_error::SystemError;
- use crate::{
- driver::tty::virtual_terminal::vc_manager,
- filesystem::vfs::{
- file::{File, FileMode},
- ROOT_INODE,
- },
- process::{Pid, ProcessManager},
- };
- /// @brief 初始化pid=1的进程的stdio
- pub fn stdio_init() -> Result<(), SystemError> {
- if ProcessManager::current_pcb().pid() != Pid(1) {
- return Err(SystemError::EPERM);
- }
- let tty_path = format!(
- "/dev/{}",
- vc_manager()
- .current_vc_tty_name()
- .expect("Init stdio: can't get tty name")
- );
- let tty_inode = ROOT_INODE()
- .lookup(&tty_path)
- .unwrap_or_else(|_| panic!("Init stdio: can't find {}", tty_path));
- let stdin =
- File::new(tty_inode.clone(), FileMode::O_RDONLY).expect("Init stdio: can't create stdin");
- let stdout =
- File::new(tty_inode.clone(), FileMode::O_WRONLY).expect("Init stdio: can't create stdout");
- let stderr = File::new(tty_inode.clone(), FileMode::O_WRONLY | FileMode::O_SYNC)
- .expect("Init stdio: can't create stderr");
- /*
- 按照规定,进程的文件描述符数组的前三个位置,分别是stdin, stdout, stderr
- */
- assert_eq!(
- ProcessManager::current_pcb()
- .fd_table()
- .write()
- .alloc_fd(stdin, None)
- .unwrap(),
- 0
- );
- assert_eq!(
- ProcessManager::current_pcb()
- .fd_table()
- .write()
- .alloc_fd(stdout, None)
- .unwrap(),
- 1
- );
- assert_eq!(
- ProcessManager::current_pcb()
- .fd_table()
- .write()
- .alloc_fd(stderr, None)
- .unwrap(),
- 2
- );
- return Ok(());
- }
|