|
@@ -409,6 +409,8 @@ ul do_execve(struct pt_regs *regs, char *path, char *argv[], char *envp[])
|
|
|
|
|
|
// 关闭之前的文件描述符
|
|
|
process_exit_files(current_pcb);
|
|
|
+
|
|
|
+ process_open_stdio(current_pcb);
|
|
|
|
|
|
// 清除进程的vfork标志位
|
|
|
current_pcb->flags &= ~PF_VFORK;
|
|
@@ -640,6 +642,10 @@ void process_init()
|
|
|
|
|
|
// 初始化init进程的signal相关的信息
|
|
|
initial_proc_init_signal(current_pcb);
|
|
|
+
|
|
|
+ // TODO: 这里是临时性的特殊处理stdio,待文件系统重构及tty设备实现后,需要改写这里
|
|
|
+ process_open_stdio(current_pcb);
|
|
|
+
|
|
|
// 临时设置IDLE进程的的虚拟运行时间为0,防止下面的这些内核线程的虚拟运行时间出错
|
|
|
current_pcb->virtual_runtime = 0;
|
|
|
barrier();
|
|
@@ -724,11 +730,13 @@ int process_wakeup_immediately(struct process_control_block *pcb)
|
|
|
*/
|
|
|
uint64_t process_exit_files(struct process_control_block *pcb)
|
|
|
{
|
|
|
+ // TODO: 当stdio不再被以-1来特殊处理时,在这里要释放stdio文件的内存
|
|
|
+
|
|
|
// 不与父进程共享文件描述符
|
|
|
if (!(pcb->flags & PF_VFORK))
|
|
|
{
|
|
|
|
|
|
- for (int i = 0; i < PROC_MAX_FD_NUM; ++i)
|
|
|
+ for (int i = 3; i < PROC_MAX_FD_NUM; ++i)
|
|
|
{
|
|
|
if (pcb->fds[i] == NULL)
|
|
|
continue;
|
|
@@ -843,15 +851,15 @@ int process_release_pcb(struct process_control_block *pcb)
|
|
|
int process_fd_alloc(struct vfs_file_t *file)
|
|
|
{
|
|
|
int fd_num = -1;
|
|
|
- struct vfs_file_t **f = current_pcb->fds;
|
|
|
|
|
|
for (int i = 0; i < PROC_MAX_FD_NUM; ++i)
|
|
|
{
|
|
|
+ // kdebug("currentpcb->fds[%d]=%#018lx", i, current_pcb->fds[i]);
|
|
|
/* 找到指针数组中的空位 */
|
|
|
- if (f[i] == NULL)
|
|
|
+ if (current_pcb->fds[i] == NULL)
|
|
|
{
|
|
|
fd_num = i;
|
|
|
- f[i] = file;
|
|
|
+ current_pcb->fds[i] = file;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -882,3 +890,14 @@ void process_set_pcb_name(struct process_control_block *pcb, const char *pcb_nam
|
|
|
{
|
|
|
__set_pcb_name(pcb, pcb_name);
|
|
|
}
|
|
|
+
|
|
|
+void process_open_stdio(struct process_control_block *pcb)
|
|
|
+{
|
|
|
+ // TODO: 这里是临时性的特殊处理stdio,待文件系统重构及tty设备实现后,需要改写这里
|
|
|
+ // stdin
|
|
|
+ pcb->fds[0] = -1UL;
|
|
|
+ // stdout
|
|
|
+ pcb->fds[1] = -1UL;
|
|
|
+ // stderr
|
|
|
+ pcb->fds[2] = -1UL;
|
|
|
+}
|