Merge branch 'master' into sata-ahci-dev
[lunaix-os.git] / lunaix-os / kernel / demos / signal_demo.c
1 #include <lunaix/lunistd.h>
2 #include <lunaix/proc.h>
3 #include <lunaix/signal.h>
4 #include <lunaix/spike.h>
5 #include <lunaix/syslog.h>
6 #include <lunaix/types.h>
7
8 LOG_MODULE("SIGDEMO")
9
10 void __USER__
11 sigchild_handler(int signum)
12 {
13     kprintf(KINFO "SIGCHLD received\n");
14 }
15
16 void __USER__
17 sigsegv_handler(int signum)
18 {
19     pid_t pid = getpid();
20     kprintf(KWARN "SIGSEGV received on process %d\n", pid);
21     _exit(signum);
22 }
23
24 void __USER__
25 sigalrm_handler(int signum)
26 {
27     pid_t pid = getpid();
28     kprintf(KWARN "I, pid %d, have received an alarm!\n", pid);
29 }
30
31 void __USER__
32 _signal_demo_main()
33 {
34     signal(_SIGCHLD, sigchild_handler);
35     signal(_SIGSEGV, sigsegv_handler);
36     signal(_SIGALRM, sigalrm_handler);
37
38     alarm(5);
39
40     int status;
41     pid_t p = 0;
42
43     kprintf(KINFO "Child sleep 3s, parent pause.\n");
44     if (!fork()) {
45         sleep(3);
46         _exit(0);
47     }
48
49     pause();
50
51     kprintf("Parent resumed on SIGCHILD\n");
52
53     for (int i = 0; i < 5; i++) {
54         pid_t pid = 0;
55         if (!(pid = fork())) {
56             signal(_SIGSEGV, sigsegv_handler);
57             sleep(i);
58             if (i == 3) {
59                 i = *(int*)0xdeadc0de; // seg fault!
60             }
61             kprintf(KINFO "%d\n", i);
62             _exit(0);
63         }
64         kprintf(KINFO "Forked %d\n", pid);
65     }
66
67     while ((p = wait(&status)) >= 0) {
68         short code = WEXITSTATUS(status);
69         if (WIFSIGNALED(status)) {
70             kprintf(KINFO "Process %d terminated by signal, exit_code: %d\n",
71                     p,
72                     code);
73         } else if (WIFEXITED(status)) {
74             kprintf(KINFO "Process %d exited with code %d\n", p, code);
75         } else {
76             kprintf(KWARN "Process %d aborted with code %d\n", p, code);
77         }
78     }
79
80     kprintf("done\n");
81
82     _exit(0);
83 }