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