From 8b3338f48f2c08c12a7535d92bfbe919e671601f Mon Sep 17 00:00:00 2001 From: Yi-Ting Shih Date: Mon, 6 Apr 2026 21:54:28 +0800 Subject: [PATCH] Fix: leave fileid 0 and 1 to stdio --- code/userprog/ksyscall.h | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/code/userprog/ksyscall.h b/code/userprog/ksyscall.h index 59408b3..68718f1 100755 --- a/code/userprog/ksyscall.h +++ b/code/userprog/ksyscall.h @@ -47,27 +47,39 @@ OpenFileId SysOpen(char *name) { = kernel->fileSystem->Open(name); if (kernel->fileSystem->fileDescriptorTable[i] == NULL) return -1; - return i + 1; // OpenFileId starts from 1 + return i + 2; // OpenFileId starts from 2 (0=stdin, 1=stdout reserved) } return -1; } int SysWrite(char *buffer, int size, OpenFileId id) { - int idx = id - 1; // Convert 1-based id to 0-based index + if (id == 1) { // Console output (stdout) + for (int i = 0; i < size; i++) + kernel->synchConsoleOut->PutChar(buffer[i]); + return size; + } + int idx = id - 2; // Convert to 0-based index (ids 2+ are files) if (idx < 0 || idx >= 20 || kernel->fileSystem->fileDescriptorTable[idx] == NULL) return -1; return kernel->fileSystem->fileDescriptorTable[idx]->Write(buffer, size); } int SysRead(char *buffer, int size, OpenFileId id) { - int idx = id - 1; // Convert 1-based id to 0-based index + if (id == 0) { // Console input (stdin) + for (int i = 0; i < size; i++) + buffer[i] = kernel->synchConsoleIn->GetChar(); + return size; + } + int idx = id - 2; // Convert to 0-based index (ids 2+ are files) if (idx < 0 || idx >= 20 || kernel->fileSystem->fileDescriptorTable[idx] == NULL) return -1; return kernel->fileSystem->fileDescriptorTable[idx]->Read(buffer, size); } int SysClose(OpenFileId id) { - int idx = id - 1; // Convert 1-based id to 0-based index + if (id == 0 || id == 1) // Cannot close console + return 0; + int idx = id - 2; // Convert to 0-based index (ids 2+ are files) if (idx < 0 || idx >= 20 || kernel->fileSystem->fileDescriptorTable[idx] == NULL) return 0; delete kernel->fileSystem->fileDescriptorTable[idx];