X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/2803826a2373620dbfce8a5bff1e6a01dd594953..1f37d39e678168ffc089bcde6f9ea203c4763550:/lunaix-os/kernel/lxinit.c diff --git a/lunaix-os/kernel/lxinit.c b/lunaix-os/kernel/lxinit.c index 2de87c5..8a19841 100644 --- a/lunaix-os/kernel/lxinit.c +++ b/lunaix-os/kernel/lxinit.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -9,7 +10,6 @@ #include #include #include -#include extern uint8_t __kernel_start; @@ -25,6 +25,21 @@ 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__ +sigalrm_handler(int signum) +{ + pid_t pid = getpid(); + kprintf(KWARN "I, pid %d, have received an alarm!\n", pid); +} + void __USER__ _lxinit_main() { @@ -39,6 +54,10 @@ _lxinit_main() #endif signal(_SIGCHLD, sigchild_handler); + signal(_SIGSEGV, sigsegv_handler); + signal(_SIGALRM, sigalrm_handler); + + alarm(5); int status; #ifdef WAIT_DEMO @@ -67,15 +86,15 @@ _lxinit_main() waitpid(-1, &status, WNOHANG); - 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! } - tty_put_char('0' + i); - tty_put_char('\n'); + kprintf(KINFO "%d\n", i); _exit(0); } kprintf(KINFO "Forked %d\n", pid); @@ -83,7 +102,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); @@ -109,7 +132,7 @@ _lxinit_main() } if ((keyevent.state & KBD_KEY_FPRESSED) && (keyevent.keycode & 0xff00) <= KEYPAD) { - tty_put_char((char)(keyevent.keycode & 0x00ff)); + console_write_char((char)(keyevent.keycode & 0x00ff)); // FIXME: io to vga port is privileged and cause #GP in user mode // tty_sync_cursor(); }