X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/8357bda627bdf02c1b69eecf27993182239fb463..cb529e7c1abcfe6b61241e47a780172031b82840:/lunaix-os/kernel/lxinit.c diff --git a/lunaix-os/kernel/lxinit.c b/lunaix-os/kernel/lxinit.c index f7b0f95..fa5ce38 100644 --- a/lunaix-os/kernel/lxinit.c +++ b/lunaix-os/kernel/lxinit.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -16,8 +17,23 @@ LOG_MODULE("INIT") // #define FORK_BOMB_DEMO #define WAIT_DEMO +#define IN_USER_MODE -void +void __USER__ +sigchild_handler(int signum) +{ + kprintf(KINFO "SIGCHLD received\n"); +} + +void __USER__ +sigsegv_handler(int signum) +{ + pid_t pid = getpid(); + kprintf(KWARN "SIGSEGV received on process %d\n", pid); + _exit(signum); +} + +void __USER__ _lxinit_main() { #ifdef FORK_BOMB_DEMO @@ -30,6 +46,9 @@ _lxinit_main() } #endif + signal(_SIGCHLD, sigchild_handler); + signal(_SIGSEGV, sigsegv_handler); + int status; #ifdef WAIT_DEMO // 测试wait @@ -40,6 +59,7 @@ _lxinit_main() kprintf("I am child, I am about to terminated\n"); _exit(1); } + pause(); pid_t child = wait(&status); kprintf("I am parent, my child (%d) terminated normally with code: %d.\n", child, @@ -48,22 +68,18 @@ _lxinit_main() pid_t p = 0; - if (!(p = fork())) { - kprintf("Test no hang!"); - sleep(1); + if (!fork()) { + kprintf("Test no hang!\n"); + sleep(6); _exit(0); } - waitpid(-1, &status, 0); - // FIXME: WNOHANG还有点问题…… - // waitpid(-1, &status, WNOHANG); + waitpid(-1, &status, WNOHANG); - sleep(2); - - // 这里是就是LunaixOS的第一个进程了! - for (size_t i = 0; i < 10; i++) { + for (size_t i = 0; i < 5; i++) { pid_t pid = 0; if (!(pid = fork())) { + signal(_SIGSEGV, sigsegv_handler); sleep(i); if (i == 3) { i = *(int*)0xdeadc0de; // seg fault! @@ -77,7 +93,11 @@ _lxinit_main() while ((p = wait(&status)) >= 0) { short code = WEXITSTATUS(status); - if (WIFEXITED(status)) { + if (WIFSIGNALED(status)) { + kprintf(KINFO "Process %d terminated by signal, exit_code: %d\n", + p, + code); + } else 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); @@ -98,15 +118,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(); + // FIXME: io to vga port is privileged and cause #GP in user mode + // tty_sync_cursor(); } } - spin(); } \ No newline at end of file