将TTY与stdio进行连接,实现基本的stdio功能 (#217)

* 将stdio与tty接上
This commit is contained in:
login
2023-03-31 12:54:37 +08:00
committed by GitHub
parent 5fb12ce447
commit 20e3152e1e
21 changed files with 528 additions and 169 deletions

View File

@ -48,6 +48,7 @@ extern void process_exit_signal(struct process_control_block *pcb);
extern void initial_proc_init_signal(struct process_control_block *pcb);
extern void rs_process_exit_fpstate(struct process_control_block *pcb);
extern int process_init_files();
extern int rs_init_stdio();
// 设置初始进程的PCB
#define INITIAL_PROC(proc) \
@ -452,10 +453,6 @@ ul do_execve(struct pt_regs *regs, char *path, char *argv[], char *envp[])
current_pcb->mm->brk_end = brk_start_addr;
current_pcb->mm->stack_start = stack_start_addr;
// 关闭之前的文件描述符
process_exit_files(current_pcb);
process_init_files();
// 清除进程的vfork标志位
current_pcb->flags &= ~PF_VFORK;
@ -540,9 +537,10 @@ struct process_control_block *process_init_rt_pcb(struct process_control_block *
ul initial_kernel_thread(ul arg)
{
kinfo("initial proc running...\targ:%#018lx, vruntime=%d", arg, current_pcb->virtual_runtime);
scm_enable_double_buffer();
int val = 0;
val = scm_enable_double_buffer();
rs_init_stdio();
// block_io_scheduler_init();
ahci_init();
mount_root_fs();

View File

@ -7,7 +7,7 @@ use alloc::boxed::Box;
use crate::{
arch::{asm::current::current_pcb, fpu::FpState},
filesystem::vfs::file::{File, FileDescriptorVec},
filesystem::vfs::{file::{File, FileDescriptorVec, FileMode}, ROOT_INODE},
include::bindings::bindings::{
process_control_block, CLONE_FS, PROC_INTERRUPTIBLE,
PROC_RUNNING, PROC_STOPPED, PROC_UNINTERRUPTIBLE,
@ -350,4 +350,37 @@ pub extern "C" fn rs_process_exit_fpstate(pcb: &'static mut process_control_bloc
}
}
#[no_mangle]
pub extern "C" fn rs_init_stdio() -> i32 {
let r = init_stdio();
if r.is_ok() {
return 0;
} else {
return r.unwrap_err().to_posix_errno();
}
}
// =========== 以上为导出到C的函数在将来进程管理模块被完全重构之后需要删掉他们 END ============
/// @brief 初始化pid=1的进程的stdio
pub fn init_stdio() -> Result<(), SystemError> {
if current_pcb().pid != 1 {
return Err(SystemError::EPERM);
}
let tty_inode = ROOT_INODE()
.lookup("/dev/tty0")
.expect("Init stdio: can't find tty0");
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!(current_pcb().alloc_fd(stdin).unwrap(), 0);
assert_eq!(current_pcb().alloc_fd(stdout).unwrap(), 1);
assert_eq!(current_pcb().alloc_fd(stderr).unwrap(), 2);
return Ok(());
}