mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-23 08:03:22 +00:00
@ -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();
|
||||
|
@ -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(());
|
||||
}
|
||||
|
Reference in New Issue
Block a user