示例#1
0
int
main(int argc, char *argv[])
{
 
  struct pstat st_before, st_after;
  int lowpriorityrun = 0, highpriorityrun = 0;
  printf(1, "1 - PID #%d\n", getpid());
  int rc = fork();
  int i;
  int pid = getpid();
  if(rc == 0)
    {
      printf(1, "2 - PID #%d (bout to spin 1)\n", getpid());
      spin();
      printf(1, "2 - PID #%d (bout to sleep)\n", getpid());
      sleep(200);
      printf(1, "2 - PID #%d (bout to spin 2)\n", getpid());
      spin();
      exit();
    }
  check(setpri(2) == 0, "setpri");
  if(fork() == 0)
    {
      printf(1, "3 - PID #%d (bout to sleep 1)\n", getpid());
      sleep(200);
      printf(1, "3 - PID #%d (bout to spin)\n", getpid());
      spin();
      printf(1, "3 - PID #%d (bout to sleep 2)\n", getpid());
      sleep(100);
      printf(1, " then 2");
      exit();
    }
  printf(1, "4 - PID #%d (bout to sleep)\n", getpid());
  sleep(200);
  printf(1, "5 - PID #%d\n", getpid());
  check(getpinfo(&st_before) == 0, "getpinfo");
  printf(1, "\n ****PInfo before**** \n");
  print(&st_before);
  printf(1, "5 - PID #%d (bout to spin 1)\n", getpid());
  spin();
  printf(1, "5 - PID #%d (bout to spin 2)\n", getpid());
  spin();
  check(getpinfo(&st_after) == 0, "getpinfo");
  printf(1, "\n ****PInfo after**** \n");
  print(&st_after);
  for(i = 0; i < NPROC; ++i)
    {
      if(st_before.pid[i] != pid && st_before.lticks[i] < st_after.lticks[i] && st_before.hticks[i] < st_after.hticks[i])
	lowpriorityrun++;
      if(st_before.hticks[i] < st_after.hticks[i])
	highpriorityrun++;
    }
  check(lowpriorityrun == 0, "Expected only the high priority process to run once it is awake");
  check(highpriorityrun == 1, "Expected one high priority process to run once it is awake");
  printf(1, "Should print 1"); 
  wait();
  wait();
  exit();
}
示例#2
0
int
main(int argc, char *argv[])
{
 
   struct pstat st_before, st_after;
   int pid = getpid();
   int lowpriorityrun = 0;
   int  highpriorityrun = 0;
   int i;
   check(setpri(2) == 0, "setpri");
   // check if process run in high priority mode once set to high
  
   check(getpinfo(&st_before) == 0, "getpinfo");
   printf(1, "\n ****PInfo before**** \n");
   print(&st_before);
   spin();
   check(getpinfo(&st_after) == 0, "getpinfo");
   printf(1, "\n ****PInfo after**** \n");
   print(&st_after);
   for(i = 0; i < NPROC; ++i)
   {
	if(st_before.pid[i] == pid && st_after.pid[i] == pid)
	{
		if(st_before.hticks[i] < st_after.hticks[i] && st_before.lticks[i] == st_after.lticks[i])
			highpriorityrun = 1;
	}		
   }
   check(highpriorityrun == 1, "Expected process to have run in high priority mode once priority changed to high");

   check(setpri(1) == 0, "setpri");
 
  // check if process run in low priority mode once changed back
   check(getpinfo(&st_before) == 0, "getpinfo");
   printf(1, "\n ****PInfo before**** \n");
   print(&st_before);
   spin();
   check(getpinfo(&st_after) == 0, "getpinfo");
   printf(1, "\n ****PInfo after**** \n");
   print(&st_after);
   for(i = 0; i < NPROC; ++i)
   {
	if(st_before.pid[i] == pid && st_after.pid[i] == pid)
	{
		if(st_before.lticks[i] < st_after.lticks[i] && st_before.hticks[i] == st_after.hticks[i])
			lowpriorityrun = 1;
	}		
   }
   check(lowpriorityrun == 1, "Expected process to have run in low priority mode once priority changed back to low");
   printf(1, "Should print 1 then 2"); 
   exit();
}
int
main(int argc, char *argv[])
{
   struct pstat st;

   sleep(10);
   int count = 0;
   int i, j = 0;
   for(i = 0; i < 50000000; i++)
       j += i * j + 1;

   check(getpinfo(&st) == 0, "getpinfo");

   int pid = getpid(); 
   // a weak test, only show whether if the current process gets run once
   for(i = 0; i < NPROC; i++) {
      if (st.inuse[i]) {
	  count++;
	  if (pid == st.pid[i]) {
	      printf(1, "pid: %d priority: %d\n ", st.pid[i], st.priority[i]);
	      for (j = 0; j < 4; j++)
		  printf(1, "\t level %d ticks used %d\n", j, st.ticks[i][j]);  
	      check(st.ticks[i][0] > 0, "current process must run at least once");
	  }
      }
   }

   check(count == 3, "should be three processes: init, sh, tester");

   printf(1, "TEST PASSED");
   exit();
}
示例#4
0
int
main(int argc, char *argv[])
{
   int x = settickets(23);
   
   struct pstat *stat1;
   stat1 = malloc(sizeof(*stat1));   
   int y = getpinfo(stat1);


int counter = 0;
for(counter = 0; counter < NPROC; counter++){
   printf(1, "PID %d, \n", stat1->pid[counter]);
   printf(1, "INUSE %d, \n", stat1->inuse[counter]);
   printf(1, "TICKS %d, \n", stat1->ticks[counter]);   
}

      
   
// = malloc(sizeof(stat1));
   y = y+0;
   //printf(1, x);
   printf(1, "hello world %d, \n", x);
  exit();
}
示例#5
0
int
main(int argc, char *argv[])
{
  //int x = settickets(23);
   
  //const clock_t start = clock();
  // do stuff here
  //clock_t now = clock();
  //clock_t delta = now - start;
  //return (int) start;
  struct pstat *stat1;
  stat1 = malloc(sizeof(*stat1));   
  //int y = getpinfo(stat1);
  int y = getpinfo(NULL);

  int z = setpri(1);
  printf(stdout, "SETPRI, %d\n", z);

  int counter = 0;
  //for(counter = 0; counter < NPROCS; counter++){
  printf(stdout, "aux %s, \n", stat1->aux[counter]);
    printf(stdout, "PID %d, \n", stat1->pid[counter]);
    printf(stdout, "INUSE %d, \n", stat1->inuse[counter]);
    printf(stdout, "LTICKS %d, \n", stat1->hticks[counter]);   
    printf(stdout, "HTICKS %d, \n", stat1->lticks[counter]);   
    //}     
   
  // = malloc(sizeof(stat1));
  //y = y+0;
  //printf(1, x);
    printf(stdout, "hello you, %d\n", y);
  //return 0;
  exit();
}
int main(int argc, char *argvv[]) {

	//int tickettest;

	struct pstat * stats;
	stats = (struct pstat *) malloc(sizeof(struct pstat) * 64);
	int i;

	// (settickets(0) == -1) ? printf(1,"fail\n") : printf(1,"pass\n"); //you f****d
	// (settickets(10) == -1) ? printf(1,"fail\n") : printf(1,"pass\n"); //you good
	// (settickets(40) == -1) ? printf(1,"fail\n") : printf(1,"pass\n"); //you good
	// (settickets(38) == -1) ? printf(1,"fail\n") : printf(1,"pass\n"); //you f****d
	settickets(20); //you good
	// (settickets(160) == -1) ? printf(1,"fail\n") : printf(1,"fpass\n"); //you f****d
	//printf(1, "\n");

	int runtime;

	fork_kids();
	printf(1,",10,30,60,90,120,150\n");
	for(runtime = 0; runtime < 119 ;runtime++) {
		getpinfo(stats);
		printf(1,"%d,", runtime);
		for(i = 0; i < 64; i++) {
			if(stats[i].inuse == 1 && (stats[i].pid != 1 && stats[i].pid != 2 && stats[i].pid != 3)) {
				printf(1,"%d,", stats[i].n_schedule);
			}
		}
		printf(1, "\n");
		sleep(100);
	}
	exit();
}
示例#7
0
int
main(int argc, char *argv[])
{
   struct pstat st;
   int highpriority = 0;
   int pid = getpid();
   int defaultpriorityrun = 0;
   spin();
   check(getpinfo(&st) == 0, "getpinfo");

   int i;
   printf(1, "\n **** PInfo **** \n"); 
   for(i = 0; i < NPROC; i++) {
      if (st.inuse[i]) {
	 if(st.hticks[i] != 0)
		highpriority++;
	 if(st.pid[i] == pid && st.lticks[i] > 20)
		defaultpriorityrun = 1;
         printf(1, "pid: %d hticks: %d lticks: %d\n", st.pid[i], st.hticks[i], st.lticks[i]);
      }
   }

   check(highpriority == 0, "getpinfo shouldn't return any process with hticks not equal to 0, default priority should be low(1) ");
   check(defaultpriorityrun == 1, "getpinfo should return a process having run with default priority");
   printf(1, "Should print 1 then 2");
   exit();
}
示例#8
0
文件: ticks.c 项目: amcolash/cs537
int
main(int argc, char *argv[])
{
   int pids[2];
   int ppid = getpid();
   int r, i, j;

   pids[0] = fork();
   if (pids[0] == 0) {
      r = settickets(2);
      if (r != 0) {
         printf(1, "settickets failed");
         kill(ppid);
      }
      spin();
   }

   pids[1] = fork();
   if (pids[1] == 0) {
      r = settickets(4);
      if (r != 0) {
         printf(1, "settickets failed");
         kill(ppid);
      }
      spin();
   }

   sleep(1000);

   int lticks[] = {-1, -1};
   int hticks[] = {-1, -1};
   struct pstat st;
   check(getpinfo(&st) == 0, "getpinfo");

   for(i = 0; i < NPROC; i++) {
      for(j = 0; j < 2; j++) {
         if (st.inuse[i] && st.pid[i] == pids[j]) {
            lticks[j] = st.lticks[i];
            hticks[j] = st.hticks[i];
         }
      }
   }

   for (i = 0; i < 2; i++) {
      kill(pids[i]);
      wait();
   }

   for (i = 0; i < 2; i++) {
      check(hticks[i] > 0 && lticks[i] > 0, "each process should have some hticks and lticks");
   }

   float ratio = (float)lticks[0] / (float)lticks[1];
   printf(1, "lticks child 1: %d\n", lticks[0]);
   printf(1, "lticks child 2: %d\n", lticks[1]);
   check(ratio > .25 && ratio < .75, "ratio should be about 1/2");

   printf(1, "TEST PASSED\n");
   exit();
}
示例#9
0
文件: sysproc.c 项目: vantran24/p2b
//another added syscall
int
sys_getpinfo(void)
{
	struct pstat *info;
	if(argptr(0, (void*)&info, sizeof(info)) < 0){
		return -1;
	}
	getpinfo(info);
	return 0;
}
示例#10
0
int
sys_getpinfo(void)
{
    struct pstat pstatVariable;
    struct pstat *pointer=&pstatVariable;
    if(argptr(0,(char**)(&pointer),sizeof(struct pstat*))<0)
        return -1;
    return getpinfo(pointer);

}
示例#11
0
int main(int argc, char *argv[]){
struct pstat pstatt = {{0},{0},{0},{0}};
if(getpinfo(&pstatt)==0){


}


  exit();
	 // return 0;
}
int
main(int argc, char *argv[])
{
 
   struct pstat st_before, st_after;
   int lowpriorityrun = 0;
   int highpriorityrun = 0;
   int rc = fork();
   int i;
   if(rc == 0)
   {
	spin();
	spin();
	sleep(500);
	exit();
   }
   sleep(100);
   check(setpri(2) == 0, "setpri");
   check(getpinfo(&st_before) == 0, "getpinfo");
   printf(1, "\n ****PInfo before**** \n");
   print(&st_before);
   sleep(500);  
   check(getpinfo(&st_after) == 0, "getpinfo");
   printf(1, "\n ****PInfo after**** \n");
   print(&st_after);
   for(i = 0; i < NPROC; ++i)
   {
	if(st_before.pid[i] == rc && st_after.pid[i] == rc)
	{
		if(st_before.lticks[i] < st_after.lticks[i])
			lowpriorityrun = 1;
		if(st_before.hticks[i] < st_after.hticks[i])
			highpriorityrun = 1;
	}		
   }
   check(highpriorityrun == 0, "Expected no high priority ticks when low priority running");
   check(lowpriorityrun == 1, "Expected low priority process to have run when high priority process was put to sleep");
   wait();
   printf(1, "Should print 1 then 2"); 
   exit();
}
示例#13
0
int
main(void)
{
//Adde
struct pstat ptr;
//Testing tickets syscall
if (settickets(1) == 0) {
   printf(0,"Set tickets success!\r\n");
} else {
   printf(0,"Set tickets failed!\r\n");
}
   
//Testing getpinfo
// getpinfo(ptr);
int inval = getpinfo(&ptr);

if (inval == 0) {
   int i;
   int max = 64;
   for(i=0;i<max;i++) {
      if ((ptr.inuse[i] == 0)&&(i < 10)) {
         printf(0,"Proc %d not in use pid=%d, hticks = %d, lticks = %d\r\n"
         ,i,ptr.pid[i],ptr.hticks[i],ptr.lticks[i]);
      }
      if(ptr.inuse[i] == 1) {
         printf(0,"Proc %d running!!! pid=%d, hticks = %d, lticks = %d\r\n"
            ,i,ptr.pid[i],ptr.hticks[i],ptr.lticks[i]);
      } else {
         //printf(0,"Proc %d not in use pid=%d, hticks = %d, lticks = %d\r\n"
          //  ,i,ptr.pid[i],ptr.hticks[i],ptr.lticks[i]);
      }
      if (i == 60) printf(0,"lotto = %d\r\n",ptr.lticks[i]);
      if (i == 61) printf(0,"qlevel = %d\r\n",ptr.lticks[i]);
      if (i == 62) printf(0,"tix = %d\r\n",ptr.lticks[i]);
      if (i == 63) printf(0,"lo_tix= %d\r\n",ptr.lticks[i]);
      if (i == 59) printf(0,"hi_tix = %d\r\n",ptr.lticks[i]);
      if (i == 58) printf(0,"Second loop ran %d times\r\n",ptr.lticks[i]);
      if (i == 57) printf(0,"First loop ran %d times\r\n",ptr.lticks[i]);
   }
   printf(0,"\r\n");
   printf(0,"Print out finished \r\n");
} else {
   printf(0,"Failed to call getpinfo!! \r\n");
   printf(0,"fail val= %d  \r\n",inval);
}


  if(fork() > 0)
    sleep(5);  // Let child exit before parent.

  exit();
}
示例#14
0
int
main(int argc, char *argv[])
{
   if(fork() == 0)
   {
   	struct pstat st_before, st_after;
	check(setpri(2) == 0, "setpri");
	check(getpinfo(&st_before) == 0, "getpinfo");
	printf(1, "\n ****PInfo before**** \n");
	print(&st_before);
	spin();
	spin();
	check(getpinfo(&st_after) == 0, "getpinfo");
	printf(1, "\n ****PInfo after**** \n");
	print(&st_after);
	compare(&st_before, &st_after);
	printf(1, "Should print 1"); 
	exit();
   }
   spin();
   printf(1, " then 2");
   exit();
}
示例#15
0
文件: usage.c 项目: vener91/cs537
// print usage info of all procresses
void
printinfo()
{
   struct pstat st;

   int r = getpinfo(&st);
   if (r != 0) {
      exit();
   }

   int i;
   for(i = 1; i < NPROC; i++) {
      if (st.inuse[i]) {
         printf(1, "pid: %d ticks: %d\n", st.pid[i], st.ticks[i]);
      }
   }
}
int
main(int argc, char *argv[])
{
   struct pstat st;

   check(getpinfo(&st) == 0, "getpinfo");

   int i, j;
   for(i = 0; i < NPROC; i++) {
      if (st.inuse[i]) {
	  printf(1, "pid: %d priority: %d\n ", st.pid[i], st.priority[i]);
	  for (j = 0; j < 4; j++)
	      printf(1, "\t level %d ticks used %d\n", j, st.ticks[i][j]);  
      }
   }

   printf(1, "TEST PASSED");
   exit();
}
int
getprocessinfo(void)
{
	struct pstat p;
	int i;
	for(i = 0; i < N; i++)
	{
		p.inuse[i] = 0;
		p.pid[i] = -1;   // the PID of each process
    		p.hticks[i] = 0; // the number of ticks each process has accumulated at HIGH priority
    		p.lticks[i] = 0; // the number of ticks each process has accumulated at LOW priority
    		p.runTimes[i] = 0;
    		p.queue[i] = -1;
	}
	int va = getpinfo(&p);
	printf(2, "Here is the list of process stat: ");
	for(i = 0; i < N; i++)
	{
		printf(2, "Process: pid %d, inuse %d, hticks %d, lticks %d\n", p.inuse[i], p.pid[i], p.hticks[i], p.lticks[i]);
	}
	return va;
}
示例#18
0
int
main(int argc, char *argv[])
{
   struct pstat st;

   check(getpinfo(&st) == 0, "getpinfo");

   int count = 0;
   int i;
   for(i = 0; i < NPROC; i++) {
      if (st.inuse[i]) {
         count++;
         printf(1, "pid: %d ticks: %d\n", st.pid[i], st.ticks[i]);
         check(st.ticks[i] > 0, "all processes must have run at least once");
      }
   }

   check(count == 3, "should be three processes: init, sh, tester");

   printf(1, "TEST PASSED");
   exit();
}
示例#19
0
int
main(int argc, char *argv[])
{
	struct pstat p;
	if(getpinfo(&p) < 0)
	{
		printf(1, "getpinfo failed!\n");
		exit();
	}

	int i;
	printf(1, "slot\tpid\t#chosen\truntime\tcharge\n");

	for(i = 0; i < NPROC; i++)
	{
		if(p.inuse[i])
		{
			printf(1, "%d\t%d\t%d\t%d\t%d\n", i, p.pid[i], p.chosen[i], p.time[i], p.charge[i]);
		}
	}
	
	exit();
}
示例#20
0
/*
 * The out of control system call
 * This is audit kitchen sink aka auditadm, aka auditon
 */
int
auditctl(
	int	cmd,
	caddr_t data,
	int	length)
{
	int result;

	switch (cmd) {
	case A_GETAMASK:
	case A_GETCOND:
	case A_GETCAR:
	case A_GETCLASS:
	case A_GETCWD:
	case A_GETKAUDIT:
	case A_GETKMASK:
	case A_GETPINFO:
	case A_GETPINFO_ADDR:
	case A_GETPOLICY:
	case A_GETQCTRL:
	case A_GETSTAT:
		if (secpolicy_audit_getattr(CRED(), B_FALSE) != 0)
			return (EPERM);
		break;
	default:
		if (secpolicy_audit_config(CRED()) != 0)
			return (EPERM);
		break;
	}

	switch (cmd) {
	case A_GETPOLICY:
		result = getpolicy(data);
		break;
	case A_SETPOLICY:
		result = setpolicy(data);
		break;
	case A_GETAMASK:
		result = getamask(data);
		break;
	case A_SETAMASK:
		result = setamask(data);
		break;
	case A_GETKMASK:
		result = getkmask(data);
		break;
	case A_SETKMASK:
		result = setkmask(data);
		break;
	case A_GETKAUDIT:
		result = getkaudit(data, length);
		break;
	case A_SETKAUDIT:
		result = setkaudit(data, length);
		break;
	case A_GETQCTRL:
		result = getqctrl(data);
		break;
	case A_SETQCTRL:
		result = setqctrl(data);
		break;
	case A_GETCWD:
		result = getcwd(data, length);
		break;
	case A_GETCAR:
		result = getcar(data, length);
		break;
	case A_GETSTAT:
		result = getstat(data);
		break;
	case A_SETSTAT:
		result = setstat(data);
		break;
	case A_SETUMASK:
		result = setumask(data);
		break;
	case A_SETSMASK:
		result = setsmask(data);
		break;
	case A_GETCOND:
		result = getcond(data);
		break;
	case A_SETCOND:
		result = setcond(data);
		break;
	case A_GETCLASS:
		result = getclass(data);
		break;
	case A_SETCLASS:
		result = setclass(data);
		break;
	case A_GETPINFO:
		result = getpinfo(data);
		break;
	case A_GETPINFO_ADDR:
		result = getpinfo_addr(data, length);
		break;
	case A_SETPMASK:
		result = setpmask(data);
		break;
	default:
		result = EINVAL;
		break;
	}
	return (result);
}
示例#21
0
int
sys_getpinfo(void)
{
  int y = getpinfo();
  return y;
}
示例#22
0
int main(int argc, char *argv[]) {
    //Initialize the shell
    init_shell();

    int numofpipes[MAXCMD];

    //Initialize jobs array
    init_jobsarray();

    //Holds the command
    char wholecommand[MAXNUM];
    char dupwholecommand[MAXNUM];
    char *cmdarr[MAXCMD][MAXOP];	//The rows hold commands separated by ;
    //while the columns hold the command and its options separated by " " or \t
    char *pipecmdarr[MAXCMD][MAXCMD][MAXOP];

    char maincmd[MAXNUM];

    //For prompt
    char username[MAXNUM],sysname[MAXNUM],cwdir[MAXNUM];
    char homedir[MAXNUM];
    getcwd(homedir,MAXNUM);
    char duphomedir[MAXNUM];
    duphomedir[0] = '\0';
    strcat(duphomedir,homedir);

    //For tokenizing
    char *str1 = NULL;
    char *token = NULL;

    //Counters
    int i;

    //Initializing background process array
    for(i=0; i<(MAXNUM*MAXOP); i++) {
        bgrounds[i].used = 0;
    }
    //Initializing ends

    //Initialize to NULL
    initarray(cmdarr);

    char *hdir[MAXNUM];
    //Tokenize home directory
    tokenize(str1,hdir,token,duphomedir);
    //Tokenize home directory done

    while(1) {

        if(signal(SIGINT,signal_handler)==SIG_ERR)
            perror("Signal not caught!!");
        if(signal(SIGCHLD,signal_handler)==SIG_ERR)
            perror("Signal not caught!!");

        for(i=0; i<MAXCMD; i++)
            numofpipes[i] = 0;

        rectifyjobsarray();

        //Printing message on background process completion
        for(i=0; i<(MAXNUM*MAXOP); i++) {
            if(bgrounds[i].used == 0)
                continue;
            bgrounds[i].used = 0;
            if(bgrounds[i].status == 1) {
                //printf("Process %s with pid %d terminated normally\n",bgrounds[i].name,bgrounds[i].pid);
            }
            else {
                //printf("Process %s with pid %d terminated with status %d\n",bgrounds[i].name,bgrounds[i].pid,bgrounds[i].status);
            }
        }

        //Renitializing background process array
        for(i=0; i<(MAXNUM*MAXOP); i++) {
            bgrounds[i].used = 0;
        }
        //Renitializing ends

        //Initialize to NULL
        initarray(cmdarr);
        initpipecmd(pipecmdarr);

        //For prompt
        username[0] = '\0';
        cwdir[0] = '\0';
        strcat(username,getlogin());
        gethostname(sysname,MAXNUM);
        getcwd(cwdir,MAXNUM);
        char dupcwdir[MAXNUM];
        dupcwdir[0] = '\0';
        strcat(dupcwdir,cwdir);

        directorysettings(cwdir,homedir,dupcwdir,hdir);
        //Prompt settings done

        //Take commands
        printf("<%s@%s:%s>",username,sysname,cwdir);
        wholecommand[0] = '\0';
        dupwholecommand[0] = '\0';
        readLine(wholecommand);
        wholecommand[strlen(wholecommand)-1]='\0';
        strcpy(dupwholecommand,wholecommand);
        //Done taking commands

        //Tokenize
        maintokenize(cmdarr,dupwholecommand);
        //tokentest(cmdarr);
        pipetokenize(cmdarr,pipecmdarr,numofpipes);
        //pipetokenizetest(cmdarr,pipecmdarr,numofpipes);
        //exit(EXIT_SUCCESS);
        //continue;
        //Tokenize done


        //Executing each ; separated command
        for(i = 0; i< MAXCMD; i++) {
            if(cmdarr[i][0] == NULL)
                continue;
            maincmd[0] = '\0';
            strcat(maincmd,cmdarr[i][0]);

            strcpy(infile,"\0");
            strcpy(outfile,"\0");


            if(numofpipes[i] != 0) {		//Execute piped commands
                pipesexecute(cmdarr, pipecmdarr, numofpipes, i);
                continue;
            }


            if((strcmp(maincmd,"echo") == 0) || (strcmp(maincmd,"pwd") == 0) || (strcmp(maincmd,"cd") == 0)\
                    || (strcmp(maincmd,"clear") == 0) || (strcmp(maincmd,"quit") == 0) || (strcmp(maincmd,"pinfo") == 0) ||
                    strcmp(maincmd,"jobs") == 0 || strcmp(maincmd,"overkill") == 0 || strcmp(maincmd,"kjob") == 0
                    || strcmp(maincmd,"fg") == 0 ) {

                int dupstdout = dup(1);
                int dupstdin = dup(0);

                if(checkinfile(cmdarr,i) == 1) {

                    if(strcmp(infile,"\0") != 0) {
                        int in=open(infile,O_RDONLY);
                        dup2(in,0);
                        close(in);
                    }
                }

                int outretval = checkoutfile(cmdarr,i);
                if(outretval == 1 || outretval == 2) {

                    if(strcmp(outfile,"\0") != 0) {
                        if(outretval == 1) {
                            int out=open(outfile,O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);
                            dup2(out,1);
                            close(out);
                        }
                        else {
                            if(fopen(outfile,"r") == NULL) {
                                int out=open(outfile,O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);
                                dup2(out,1);
                                close(out);
                            }
                            else {
                                int out=open(outfile,O_WRONLY | O_APPEND, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);
                                dup2(out,1);
                                close(out);
                            }
                        }
                    }
                }


                //echo execution
                if(strcmp (maincmd,"echo") == 0) {
                    exececho(wholecommand,cmdarr,i);
                }
                //echo done

                //pwd execution
                if(strcmp (maincmd,"pwd") == 0) {
                    execpwd();
                }
                //pwd done

                //chdir execution
                if(strcmp (maincmd,"cd") == 0) {
                    execcd(cmdarr,homedir,i);
                }
                //chdir done

                //clear execution
                if(strcmp (maincmd,"clear") == 0) {
                    printf("\e[1;1H\e[2J");
                }
                //clear done

                //terminal quit
                if(strcmp (maincmd,"quit") == 0) {
                    exit(EXIT_SUCCESS);
                }
                //terminal quit done

                //jobs
                if(strcmp (maincmd,"jobs") == 0) {
                    execjobs();
                }
                //jobs done

                //overkill
                if(strcmp (maincmd,"overkill") == 0) {
                    execoverkill();
                }
                //overkill done

                //kjob
                if(strcmp (maincmd,"kjob") == 0) {
                    execkjob(cmdarr,i);
                }
                //kjob done

                //fg
                if(strcmp (maincmd,"fg") == 0) {
                    execfg(cmdarr,i);
                }
                //fg done

                //pinfo
                if(strcmp (maincmd,"pinfo") == 0) {
                    pid_t proid;
                    int flag = 0;
                    if(cmdarr[i][1] == NULL)	//pinfo of shell
                        proid = getpid();
                    else {	//pinfo of given pid
                        char temps[MAXNUM];
                        strcpy(temps,cmdarr[i][1]);
                        proid = atoi(temps);
                        if(kill(proid,0) == (-1)) {
                            printf("No such process exists\n");
                            continue;
                        }
                        flag = 1;
                    }
                    getpinfo(proid, flag, homedir);
                }
                //pinfo done

                dup2(dupstdin,0);
                dup2(dupstdout,1);

            }
            else {
示例#23
0
文件: graphs.c 项目: tmfahey/cs537
int
main(int argc, char *argv[])
{
	const int KERNEL_NPROC = 64;
	const int CHILD_STARTUP_SLEEP = 100;
	const int MIN_UPTIME = 1000;
	if(argc!=2) {
    	printf(1, "%s", "USAGE: graphs.c <int testnum>\n");
		exit();
	}
	int option = atoi(argv[1]);

	if(option == 0) {
		//SAME PERCENT RESERVE
		
		//Make this reserve 50
		int returnval = reserve(50);
		if(returnval < 0) {
			printf(1, "ERROR: reserve failed\n");
		}
		//Test 4 reserve procs with 50% reserve
		//Expect ~same number of times chosen
		const int NUM_PROC = 3;
		int pids[NUM_PROC+1];
		int chosen[NUM_PROC+1];
		int time[NUM_PROC+1];
		int charge[NUM_PROC+1];
		int i;
		int pid;
		pids[0] = getpid();
                
                for(i=0; i<NUM_PROC; i++) {
			pid = fork();
			if(pid == 0) {
				//child
				returnval = reserve(50);
				if(returnval < 0) {
					printf(1, "ERROR: reserve failed\n");
				}
				break;
			}
			else {
				//parent
				pids[i+1] = pid;
			}
		}
		if(pid == 0) {
			sleep(CHILD_STARTUP_SLEEP*2);
			while(1) {
			}		
		}
		else {
			while(1) {
				sleep(MIN_UPTIME);
				struct pstat p;
				struct pstat *stats = &p;
				int returnval = getpinfo(stats);
				if(returnval < 0) {
					continue;
				}
				int count = 0;
				for(i=0; i<KERNEL_NPROC; i++) {
					int j;
					for(j=0; j<NUM_PROC+1; j++) {
						if(pids[j] == stats->pid[i] || getpid() == stats->pid[i]) {
							chosen[j] = stats->chosen[i];
							time[j] = stats->time[i];
							charge[j] = stats->charge[i];
							count++;
						}
					}
				}
				for(i=0; i<NUM_PROC+1; i++) {
					//pid,chosen,time,charge
					printf(1, "%d,%d,%d,%d\n", pids[i], chosen[i], time[i], charge[i]);
				}
			}
		}
	}

	/*else if(option == 2) {
		//DIFF BID SPOT
		
		//Make this spot with bid 50
		int returnval;
		returnval = spot(50);
		if(returnval < 0) {
			printf(1, "ERROR: spot failed\n");
		}
		//Expect significant difference in number of times chosen between bid levels
		const int NUM_PROC = 10;
		int pids[NUM_PROC+1];
		int chosen[NUM_PROC+1];
		int time[NUM_PROC+1];
		int charge[NUM_PROC+1];
		int i;
		int pid;
		int bid = 20;
		
		pids[0] = getpid();

                for(i=0; i<NUM_PROC; i++) {
			pid = fork();
			if(pid == 0) {
				//child
				returnval = spot(bid);
				if(returnval < 0) {
					printf(1, "ERROR: spot failed\n");
				}
				break;
			}
			else {
				//parent
				if(i==4) {
					bid+=10;
				}
				pids[i+1] = pid;
			}
		}
		if(pid == 0) {
			sleep(CHILD_STARTUP_SLEEP);
			while(1) {
			}
		}
		else {
			while(1) {
				sleep(MIN_UPTIME);
				struct pstat p;
				struct pstat *stats = &p;
				int returnval = getpinfo(stats);
				if(returnval < 0) {
					printf(1, "getpinfo failed\n");
					continue;
				}
				int count = 0;
				for(i=0; i<KERNEL_NPROC; i++) {
					int j;
					for(j=0; j<NUM_PROC+1; j++) {
						if(pids[j] == stats->pid[i]) {
							chosen[j] = stats->chosen[i];
							time[j] = stats->time[i];
							charge[j] = stats->charge[i];
							count++;
						}
					}
				}
				for(i=0; i<NUM_PROC+1; i++) {
					//pid,chosen,time,charge
					printf(1, "%d,%d,%d,%d\n", pids[i], chosen[i], time[i], charge[i]);
				}
			}
		}
	}

	else if(option == 3) {
		//DIFF PERCENT RESERVE
	
		//Make this reserve with 10 percent
		int returnval;
		returnval = reserve(10);
		if(returnval < 0) {
			printf(1, "ERROR: reserve failed\n");
		}
		//Test different reservation sizes
		//Sizes are 10 (parent proc), 20, 30, 40, 50, 50
		const int NUM_PROC = 5;
		int pids[NUM_PROC+1];
		int chosen[NUM_PROC+1];
		int time[NUM_PROC+1];
		int charge[NUM_PROC+1];
		int i;
		int pid;
		int percent = 20;
		
		pids[0] = getpid();

                for(i=0; i<NUM_PROC; i++) {
			pid = fork();
			if(pid == 0) {
				//child
				returnval = reserve(percent);
				if(returnval < 0) {
					printf(1, "ERROR: spot failed\n");
				}
				break;
			}
			else {
				//parent
				if(i<NUM_PROC-2) {
					percent+=10;
				}
				pids[i+1] = pid;
			}
		}
		if(pid == 0) {
			sleep(CHILD_STARTUP_SLEEP);
			while(1){
			}
		}
		else {
			while(1) {
				sleep(MIN_UPTIME);
				struct pstat p;
				struct pstat *stats = &p;
				int returnval = getpinfo(stats);
				if(returnval < 0) {
					continue;
				}
				int count = 0;
				for(i=0; i<KERNEL_NPROC; i++) {
					int j;
					//Find pid in pstat
					for(j=0; j<NUM_PROC+1; j++) {
						if(pids[j] == stats->pid[i]) {
							chosen[j] = stats->chosen[i];
							time[j] = stats->time[i];
							charge[j] = stats->charge[i];
							count++;
						}
					}
				}
				for(i=0; i<NUM_PROC+1; i++) {
					//pid,chosen,time,charge
					printf(1, "%d,%d,%d,%d\n", pids[i], chosen[i], time[i], charge[i]);
				}
			}
		}
	}*/

	/*else if(option == 4) {
		//RESERVE CALL TOO LOW


		//Test user attempting to reserve a percentage < 0
		//Expect -1 to be returned from the reserve call
		int flag = reserve(-1);
		if(flag < 0) {
			printf(1, "Test succeeded, reserve call failed.\n");
		}
		else {
			printf(1, "ERROR: test failed. Reserve call did not fail when percentage < 0 was input.");
		}
		exit();
	}

	else if(option == 5) {
		//RESERVE CALL TOO HIGH

		//Test user attempting to reserve a percentage > 100
		//Expect -1 to be returned from the reserve call
		int flag = reserve(101);
		if(flag < 0) {
			printf(1, "Test succeeded, reserve call failed.\n");
		}
		else {
			printf(1, "ERROR: test failed. Reserve call did not fail when a percantage > 100 was input.");
		}
		exit();
	}

	else if(option == 6) {
		//RESERVE SUM TOO HIGH

		//Make this reserve of 100
		int returnval = reserve(100);
		if(returnval < 0) {
			printf(1, "ERROR: reserve failed\n");
		}
		//Test user attempting to reserve too much cpu (currentreservation + newreservation > 200)
		//Expect -1 to be returned from second child's reserve call
		const int NUM_PROC = 2;
		int pids[NUM_PROC];
		int i;
		int pid;
        for(i=0; i<NUM_PROC; i++) {
			pid = fork();
			if(pid == 0) {
				//child
				int flag = reserve(100);
				if(i==0 && flag < 0) {
					printf(1, "ERROR: incorrect reserve failed\n");
				}
				if(i==1 && flag < 0) {
					printf(1, "Test succeeded, reserve call failed.\n");
				}
				else if(i==1) {
					printf(1, "ERROR: test failed. Reserve call did not fail when the total process percent exceeded 200.");
				}
				break;
			}
			else {
				pids[i] = pid;
				sleep(100);
			}
		}
		if(pid == 0) {
			while(1);
		}
		else {
			sleep(500);
			for(i=0; i<NUM_PROC; i++) { 
				kill(pids[i]);
				wait();
			}
			exit();
		}
	}*/

	else if(option == 7) {
		//CHARGE TEST

		//Make this reserve with 100
		int returnval = reserve(100);
		if(returnval < 0) {
			printf(1,"ERROR: spot call failed\n");
		}
		//Test charge in dollars
		//Expecting time*bid/nanodollars = charge
		//NOTE: ADD 10 to time and 1 to chosen to insure no error
		struct pstat p;
		struct pstat *stats = &p;
                //returnval = getpinfo(stats);
		int prevchosen = 0;
		int prevtime = 0;
		int i;
		int pid = fork();
		if(pid == 0) {
			returnval = spot(100);
			if(returnval < 0) {
				printf(1,"ERROR: reserve call failed\n");
			}
			while(1) {
			}
		}
		sleep(MIN_UPTIME);
		returnval = getpinfo(stats);
		if(returnval >= 0) {
			for(i=0; i<KERNEL_NPROC; i++) {
				if(pid == stats->pid[i]) {
					printf(1, "%d,%d,%d,%d\n", stats->pid[i], stats->chosen[i]-prevchosen, stats->time[i]-prevtime, stats->charge[i]);
				}
			}
		}
		else {
			printf(1, "ERROR: getpinfo failed\n");
		}
		while(1);
	}
	else if(option == 9) {
		//STARVATION TEST EXTRA CREDIT

		int returnval = reserve(100);
		if(returnval < 0) {
			printf(1, "ERROR: reserve failed\n");
		}
		//Test starvation
		//Expect ~same number of times chosen
		const int NUM_PROC = 4;
		int pids[NUM_PROC+1];
		int chosen[NUM_PROC+1];
		int time[NUM_PROC+1];
		int charge[NUM_PROC+1];
		int i;
		int pid;
		pids[0] = getpid();
        for(i=0; i<NUM_PROC; i++) {
			pid = fork();
			if(pid == 0) {
				//child
				if(i==0) {
					returnval = reserve(100);
					if(returnval < 0) {
						printf(1, "ERROR: reserve failed\n");
					}
				}
				else {
					returnval = spot(100);
					if(returnval < 0) {
						printf(1, "ERROR: reserve failed\n");
					}
				}
				break;
			}
			else {
				//parent
				if(i==0) {
					sleep(20);
				}
				pids[i+1] = pid;
			}
		}
		if(pid == 0) {
			while(1) {
			}		
		}
		else {
			while(1) {
				sleep(MIN_UPTIME);
				struct pstat p;
				struct pstat *stats = &p;
				int returnval = getpinfo(stats);
				if(returnval < 0) {
					continue;
				}
				int count = 0;
				for(i=0; i<KERNEL_NPROC; i++) {
					int j;
					for(j=0; j<NUM_PROC+1; j++) {
						if(pids[j] == stats->pid[i] || getpid() == stats->pid[i]) {
							chosen[j] = stats->chosen[i];
							time[j] = stats->time[i];
							charge[j] = stats->charge[i];
							count++;
						}
					}
				}
				for(i=0; i<NUM_PROC+1; i++) {
					//pid,chosen,time,charge
					printf(1, "%d,%d,%d,%d\n", pids[i], chosen[i], time[i], charge[i]);
				}
			}
		}
	}
 return 0;
}
示例#24
0
int
main(int argc, char **argv)
{
	/*//printf(1,"getsyscallinfo is returning %d\n", getsyscallinfo()); //User program calling system call
	int i;
	for(i=-2; i<10; i+=1)
	{
	//	printf(1,"Set tickets is returning %d as and we are setting %d\n", settickets(i),i); 
		  //printf(1,"Ticket was set to %d\n")i
			//
			getpinfo(pt); 
	}
	*/

	 struct p_info
	 {
		 int pids;
		 int tk;
	 };

	 struct p_info p_table[N];

	 int i,r,j,k;
	 int ppid = getpid();
  
	 for(i = 0; i < N; i++)
	 {
		p_table[i].pids = fork();
		if (p_table[i].pids == 0) 
		{
			p_table[i].tk = i * N + N;
      r = settickets(i * N + N);
      if (r != 0) 
			{
         printf(1, "settickets failed");
         kill(ppid);
      }
      spin();
		}
	 }
	 //sleep(10);

	 int lticks[10] ;
	 int hticks[10];
   struct pstat st;
	 getpinfo(&st);	

	
   for(k = 0; i < NPROC; k++)
	 {
      for(j = 0; j < N; j++)
			{
         if (st.inuse[i] && (st.pid[i] == p_table[j].pids)) {
					  lticks[j] = st.lticks[i];
            hticks[j] = st.hticks[i];
						printf(1,"pid: %d\t tickets: %d\t ltick: %d\t hticks: %d\n",p_table[j].pids, p_table[j].tk, hticks[j], lticks[j]);
         }
      }
   }

   for (i = 0; i < N; i++) {
      kill(p_table[i].pids);
      wait();
   }
	 exit();
}