#include #include #include #include #include #include #include #include #define xmknod(path, mode, maj, min) \ if (mknod(path, mode, makedev(maj, min)) < 0) exit(255); // Too early for console logs (/dev/console is created here!), so we have to resort to exiting with a weird exit code in // case of failure. static void populate_devfs() { if (mkdir("/dev", 0755) < 0 && errno != EEXIST) exit(255); xmknod("/dev/console", 0666, 1, 0); xmknod("/dev/null", 0666, 2, 0); } int main() { if (getpid() != 1) { printf("error: init not running as PID 1.\n"); return 1; } populate_devfs(); // Before this point, we don't even have an stdout and stderr. Set it up now so that child processes (and us) can // print stuff. stdout = fopen("/dev/console", "w"); stderr = fopen("/dev/console", "w"); fprintf(stderr, "init is running as PID %d\n", getpid()); long ret = syscall(SYS_fork); if (ret == 0) { char* argv[] = { "/bin/hello", "--help", NULL }; execv("/bin/hello", argv); } else { printf("my child is PID %ld!\n", ret); } }