Exemplo n.º 1
0
/*I denna funktion hanteras alla kommandon som inte är cd. Det är uppdelat i
två delar. Första delen startar upp en child process och kör det kommando 
användaren har skrivit in. Därefter kollar vi om det är en bakgrunsprocess
eller förgrundsprocess. Är det en bakgrundsprocess skriver vi enbart ut 
att processen har startat (nerstägning av bakgrundsproceserna hanteras i en
annan funktion som vi kör varje gång man går in i kommandotolksloopen.
Är det en förgrundsprocess väntar vi in att den ska avlsutas innan vi går 
vidare i programmet. Vi räknar även ut hur lång tid processen tog och 
beroende på om processen avlsutades själv eller med en annan signal än 0
skriver vi ut hur den avslutades.*/
void executeCommand(bool bgProcess, char **arguments){
	struct timeval start, end;
	double elapsed;
	gettimeofday(&start, NULL); /*Hämta in aktuell tid för senare uträkning*/
	pid_t childProcess = startFork(); /*Skapa processen*/
	if (0 == childProcess){
		execvp(arguments[0], arguments); /*Exekvera kommandot med argument*/
		perror("Nu va det något galet med det du skrev in...");
		exit(1);
	}
	/*Om det är en bakgrundsprocess:*/
	if (bgProcess){
		printf("Bakgrundsprocess startad med process ID: %d\n", childProcess);

	}
	/*Om det är en förgrundsprocess*/
	else{
		int status;
		printf("Förgrundsprocess startad med process ID: %d\n", childProcess);
		waitpid(childProcess, &status, 0); /*Väntar in att processen ska bli klar*/
		gettimeofday(&end, NULL); /*Hämta in aktuell tid för tidsberäknings nedan*/
		elapsed = (end.tv_sec - start.tv_sec) * 1000000;
		elapsed = (elapsed + (end.tv_usec - start.tv_usec)) / 1000;
		if (0 == status){
			printf("Förgrundsprocess %d avslutad \n", childProcess);
			printf("Tid för process: %f ms", elapsed);
		}
		else{
			printf("Förgrundsprocess %d avlsutad med signal %d\n", childProcess, status);
			printf("Tid för process: %f ms", elapsed);
		}
	}
}
Exemplo n.º 2
0
void run(char ** args){

        bool runBg = false;

        clock_t start, end;
        pid_t  pid;
        double elapsed;



        int i=0;

      while(args[i] != NULL){
          i++;
          printf("%i\n", i);
        }

      if (strcmp(&(args[i-1][strlen(args[i-1])-1]), "&") == 0)
        runBg = true;
      else
        runBg =false;

      if(runBg)
          printf("%s\n", "bg is runnign");


      if (runBg){
          if(pipe(p1)== -1)
              perror("Pipe creation error");
        }

        //Starting the timer
            start = clock();

            //printf("%s\n", start);

        /*Create pipe to execute command line actions and arguments*/


          pid = startFork();


          if(0 == pid){
            if (runBg){
                if (dup2(p1[STDIN_FILENO],STDIN_FILENO)== -1)
                    errHandler("dup2 error");
                  closePipe(p1);
            }

            if (execvp(args[0], args) < 0)
                errHandler("That is not a valid command..");


          }

          if (runBg){

            closePipe(p1);
          }

          else{

            waitpid(pid, NULL, 0);

            end = clock();
            elapsed = ((double) (end-start)) / CLOCKS_PER_SEC;
            fprintf(stderr, "Time elapsed for process: %f s\n", elapsed);
            printf("%i\n", pid);

}

}