+#ifdef FORK_BOMB_DEMO
+ // fork炸弹
+ for (;;) {
+ pid_t p;
+ if ((p = fork())) {
+ kprintf(KDEBUG "Pinkie Pie #%d: FUN!\n", p);
+ }
+ }
+#endif
+
+ signal(_SIGCHLD, sigchild_handler);
+ signal(_SIGSEGV, sigsegv_handler);
+
+ int status;
+#ifdef WAIT_DEMO
+ // 测试wait
+ kprintf("I am parent, going to fork my child and wait.\n");
+ if (!fork()) {
+ kprintf("I am child, going to sleep for 2 seconds\n");
+ sleep(2);
+ 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,
+ WEXITSTATUS(status));
+#endif
+
+ pid_t p = 0;
+
+ if (!fork()) {
+ kprintf("Test no hang!\n");
+ sleep(6);
+ _exit(0);
+ }
+
+ waitpid(-1, &status, WNOHANG);
+
+ for (size_t i = 0; i < 5; i++) {