Exercise+xxx.1

=Exercise 1= toc Vi skal lave et program, der opretter en "child process". Dvs. en process der udspringer fra main (en parent process).

Denne "child process" skal indeholde “Hi! I am the child process”, og udskrive værdien af fork, samt process ID. Parent process skal udskrive “Hi! I am the parent process”, samt udskrive værdien af fork og process ID.

Fork opretter en "child proces s", der afviger fra "parent process" i sin process ID, og i det faktum, at ressourcen anvendelser, der er sat til 0. Returværdi Hvis process ID returnere et 0 i parent processen, er det lig med "succes", og der bliver oprettet en child process. Hvis det process ID der blive returneret er -1, vil "child process'en" ikke blive skabt.

code format="cpp"
 * 1) include
 * 2) include
 * 3) include

using namespace std;

int main {   pid_t pid; pid = fork; // Child process if(pid == 0) {       cout << "Hi! I’m the child process!" << endl; cout << "the value returned from fork " << pid << endl; cout << "Process ID: " << getpid << endl; } // parent process else {       cout << "Hi! I’m the parent process!" << endl; cout << "the value returned from fork: " << pid << endl; cout << "PID of the process: " << getpid << endl;

} } code

=Exercise 2 – Waiting for child processes to complete=
 * Opgaven lyder:**
 * I denne opgave skal vi lave et program som laver 2 child processer.
 * Første child process skal udskrive "tick" hvert sekund i 5 sekunder.
 * Anden child process skal udskrive "tock" hvert sekund i 8 sekunder.
 * Parrent processen skal vente på 2 child processer og derefter skrive "Done".

Vi starter med at lave 2 status variabler som bruges til at få parrent processen til at vente på child processerne code format="cpp" int status=0, status2=0; code I nedenstående kode laves første child proces, og child processen sættes igang med at udskrive "Tick" hvert sekund i 5 sekunder! pid afgøre om det er child eller parrent proces. pid er at typen pid_t som er en form for integer. code format="cpp" pid_t pid; pid = fork; if( pid == 0 ) {   for(int i = 0; i < 5; i++) {   cout << "Child 0 - Tick" << endl; sleep(1); } } code Hvis pid bliver li 1, kommer man ind i parrent processen som igen skal fork en child process! Den nye child process skal udskrive "Tock" hvert sekund i 8 sekunder. code format="cpp" else {   pid_t pid; pid = fork; if( pid == 0 ) {       for(int i = 0; i < 8; i++ ) {           cout << "Child 1 - Tock" << endl; sleep(1); }   }    else {       wait(&status); wait(&status2); cout << "DONE WITH PROCESSES" << endl; } } code For at undgå at parrent processen udskriver "Done", bruges wait funktionen. Denne funktion venter med at eksekvere parrent processen indtil de 2 child processer er færdige. Funktionen benytter en reference til status og status2.

=Exercise 3= I denne opgave har vi lavet vores egen kommando prompts. Vi har fået udleveret en handout, hvor vi har skulle skrive koden til funktionen "void executeCommand(string cmd)"

code format="cpp" void executeCommand(string cmd) {   int pid; vector tokens = tokenize(cmd);

string path = "/bin/" + tokens[0];

char** args = new char* [tokens.size+1]; for(unsigned int i = 0; i < tokens.size; i++) args[i] = (char*) tokens[i].c_str; args[tokens.size] = NULL;

pid = fork;

if(pid==0) {   execv(path.c_str, (char* const*)args); cout << "unknown command" << endl; _exit(1); } }

code Alle kommandoer der ligger i biblioteket /bin, skal kunne bruges. for eksempel disse: o pwd o ls –l o touch temp1.txt o cp temp1.txt temp2.txt o hvis en kommando ikke findes skal det udskrives: unknown command” o hvis bruger skriver "exit" skal programmet lukke

Herunder ses at kommandoerne ovenover virker efter hensigten.