X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/14b86eca7f36eedde35cb47b41afc36f9097ea7c..db4d7d52fa00cc2fd3f25d971f57b73406d816ba:/lunaix-os/kernel/lxinit.c diff --git a/lunaix-os/kernel/lxinit.c b/lunaix-os/kernel/lxinit.c index d951a9f..a767ec7 100644 --- a/lunaix-os/kernel/lxinit.c +++ b/lunaix-os/kernel/lxinit.c @@ -2,13 +2,13 @@ #include #include #include +#include #include #include #include #include #include #include -#include extern uint8_t __kernel_start; @@ -16,8 +16,9 @@ LOG_MODULE("INIT") // #define FORK_BOMB_DEMO #define WAIT_DEMO +#define IN_USER_MODE -void +void __USER__ _lxinit_main() { #ifdef FORK_BOMB_DEMO @@ -30,6 +31,7 @@ _lxinit_main() } #endif + int status; #ifdef WAIT_DEMO // 测试wait kprintf("I am parent, going to fork my child and wait.\n"); @@ -39,29 +41,45 @@ _lxinit_main() kprintf("I am child, I am about to terminated\n"); _exit(1); } - int status; + wait(&status); pid_t child = wait(&status); - kprintf( - "I am parent, my child (%d) terminated with code: %d.\n", child, status); + kprintf("I am parent, my child (%d) terminated normally with code: %d.\n", + child, + WEXITSTATUS(status)); #endif - sleep(5); + pid_t p = 0; + + if (!fork()) { + kprintf("Test no hang!\n"); + sleep(6); + _exit(0); + } + + waitpid(-1, &status, WNOHANG); - // 这里是就是LunaixOS的第一个进程了! - for (size_t i = 0; i < 10; i++) { + for (size_t i = 0; i < 5; i++) { pid_t pid = 0; if (!(pid = fork())) { sleep(i); if (i == 3) { i = *(int*)0xdeadc0de; // seg fault! } - tty_put_char('0' + i); - tty_put_char('\n'); + kprintf(KINFO "%d\n", i); _exit(0); } kprintf(KINFO "Forked %d\n", pid); } + while ((p = wait(&status)) >= 0) { + short code = WEXITSTATUS(status); + if (WIFEXITED(status)) { + kprintf(KINFO "Process %d exited with code %d\n", p, code); + } else { + kprintf(KWARN "Process %d aborted with code %d\n", p, code); + } + } + char buf[64]; kprintf(KINFO "Hello processes!\n"); @@ -76,15 +94,15 @@ _lxinit_main() struct kdb_keyinfo_pkt keyevent; while (1) { if (!kbd_recv_key(&keyevent)) { - // yield(); + yield(); continue; } if ((keyevent.state & KBD_KEY_FPRESSED) && (keyevent.keycode & 0xff00) <= KEYPAD) { - tty_put_char((char)(keyevent.keycode & 0x00ff)); - tty_sync_cursor(); + console_write_char((char)(keyevent.keycode & 0x00ff)); + // FIXME: io to vga port is privileged and cause #GP in user mode + // tty_sync_cursor(); } } - spin(); } \ No newline at end of file