summaryrefslogtreecommitdiff
path: root/user/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'user/init.c')
-rw-r--r--user/init.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/user/init.c b/user/init.c
new file mode 100644
index 0000000..f36ba31
--- /dev/null
+++ b/user/init.c
@@ -0,0 +1,37 @@
+// init: The initial user-level program
+
+#include "kernel/types.h"
+#include "kernel/stat.h"
+#include "user/user.h"
+#include "kernel/fcntl.h"
+
+char *argv[] = { "sh", 0 };
+
+int
+main(void)
+{
+ int pid, wpid;
+
+ if(open("console", O_RDWR) < 0){
+ mknod("console", 1, 1);
+ open("console", O_RDWR);
+ }
+ dup(0); // stdout
+ dup(0); // stderr
+
+ for(;;){
+ printf(1, "init: starting sh\n");
+ pid = fork();
+ if(pid < 0){
+ printf(1, "init: fork failed\n");
+ exit();
+ }
+ if(pid == 0){
+ exec("sh", argv);
+ printf(1, "init: exec sh failed\n");
+ exit();
+ }
+ while((wpid=wait()) >= 0 && wpid != pid)
+ printf(1, "zombie!\n");
+ }
+}