shell can launch another user processgit add .git add .!

This commit is contained in:
2026-07-12 20:13:13 -05:00
parent e2ab130324
commit 5c7febbbf0
15 changed files with 403 additions and 220 deletions

View File

@@ -25,7 +25,11 @@ typedef struct registers {
static int32_t sys_exit(int status) {
process_t* task = current_task();
task->state = STATE_DEAD;
task->state = STATE_ZOMBIE;
task->exit_status = status;
if (task->waiting) {
wake(task->waiting);
}
exit();
return 0;
}
@@ -163,6 +167,9 @@ static int32_t sys_exec(registers_t* regs, const char* prgm) {
clear_current_pd();
uint32_t eip = load_elf_program(prgm);
if (eip == 0) {
return 0;
}
uint32_t stack_sz = PAGE_SIZE * 16;
uint32_t stack_top = 0xBFFF0000;
@@ -204,6 +211,16 @@ static int32_t sys_lseek(int fd, size_t offset, int whence) {
return 1;
}
static int32_t sys_waitpid(int pid, int* exit_status) {
process_t* current = current_task();
process_t* child = get_task_by_pid(pid);
current->state = STATE_BLOCKED;
child->waiting = current;
yield();
*exit_status = child->exit_status;
return 1;
}
void syscall(registers_t* regs) {
int32_t ret;
switch(regs->eax) {
@@ -218,6 +235,7 @@ void syscall(registers_t* regs) {
case 22: ret = sys_exec(regs, (const char*)regs->ebx); break;
case 23: ret = sys_dup2(regs->ebx, regs->ecx); break;
case 24: ret = sys_lseek(regs->ebx, regs->ecx, regs->edx); break;
case 25: ret = sys_waitpid(regs->ebx, (int*)regs->ecx); break;
default: ret = -1;
}
regs->eax = ret;