Skip to content
Snippets Groups Projects
init.c 1.33 KiB
// init: The initial user-level program

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/fcntl.h"


char consoleX[] = "consoleX";

char* make_consoleX(int i){
  if(i < 1 || i > 9){
    printf("Console number can not be more than 9.\n");
    exit(1);
  }
  int l = strlen(consoleX);
  char* str = malloc(l+1);
  strcpy(str, consoleX);
  str[7] = '0' + i;
  return str;
}


char *argv[] = { "sh", 0, 0 };

void shloop(int cur_console){

  char* cons = make_consoleX(cur_console);
  int fd;
  if((fd = open(cons, O_RDWR)) < 0){
    mknod(cons, 1, cur_console);
    fd = open(cons, O_RDWR);
  }
  dup(0);  // stdout
  dup(0);  // stderr
  int pid, wpid;

  for(;;){
    printf("init: starting sh\n");
    pid = fork();
    if(pid < 0){
      printf("init: fork failed\n");
      exit(1);
    }
    if(pid == 0){
      argv[1] = cons;
      exec("sh", argv);
      printf("init: exec sh failed\n");
      exit(1);
    }
    while((wpid=wait(0)) >= 0 && wpid != pid){
      //printf("zombie!\n");
    }
  }

}

int
main(void)
{

  int nb_consoles = 3;

  int cur_console = 0;
  int pid;

  while(cur_console++ < nb_consoles){
    pid = fork();
    if (pid < 0){
      printf("init: fork failed\n");
      exit(1);
    }
    if (pid == 0){
      shloop(cur_console);
      return 1;
    }
  }
  while(1) wait(0);
  return 0;
}