MUP1+Øvelse+XXX.1

toc =Øvelse xxx=

Simple process creation
Vi skal skrive et program som spawner en child process som udskriver en tekst samt dens pid, det samme skal parent udskrive. code format="cpp" int main { pid_t pid; pid = fork;

if (pid == 0) { cout << "Hey I'm a child " << "PID : " << getpid << endl; } else { cout << "Hey I'm parent! " << "PID : " << getpid << endl; } } code Output : code Hey I'm parent! PID : 4172 Hey I'm a child PID : 4177 code Som det kan ses har de to processer forskellige PIDer da de netop er forskellige processer, selvom pid fra fork er 0. Dette er dog for at kunne kende forskel på child og parent.

Waiting for child processes to complete
Vi skal lave 2 child processer som hver udskriver noget tekst hvert sekundt, parent skal udskrive done når begge processer er færdige. code format="cpp" int main { int i;   pid_t pid; pid = fork;

if (pid == 0) { for (i = 0; i < 6; ++i) { cout << "TICK!" << endl; sleep(1); }   	_exit(0); } else { pid = fork; if (pid == 0) {			for (i = 0; i < 9; ++i) { cout << "TOCK!" << endl; sleep(1); }			_exit(0); }   }    wait(NULL); wait(NULL); // wait for both (UGLY) cout << "DONE!" << endl; } code venter på en child proces terminere. Det er vigtigt at man kalder fra child da  afslutter hele programmet og ikke blot child.

Output: code TOCK! TICK! TOCK! TICK! TOCK! TICK! TOCK! TICK! TOCK! TICK! TOCK! TICK! TOCK! TOCK! TOCK! DONE! code

A command line interpreter
Vi skal lave en "command line interpreter" som kan exekvere programmer ligesom en normal shell. code format="cpp" void executeCommand(string cmd) {	pid_t pid; pid = fork; if (pid == 0) {		vector v = tokenize(cmd); v[0] = "/bin/" + v[0]; const char** args = new const char*[v.size+1]; int i;		for (i = 0; i < v.size; ++i) { args[i] = v[i].c_str; }		args[i] = NULL; // array given to execv is required to end with NULL execv(args[0], (char* const*)args); cout << "unknown command" << endl; } else { wait(NULL); } } code Vi er hvorefter child processen kører kommandoen som skifter kode indmaden ud med det program vi angiver. returnere ikke med mindre der er en fejl, som f.eks. at stien til programmet ikke findes. Derfor udskriver vi "//unknown command//" efter da den kun vil komme dertil hvis  ikke findes. Parent sætter sig til at vente på at child terminere så vi får en pæn udskrift. Output: code
 * ls

Debug handout.cpp
 * ls -l

total 8 drwxr-xr-x 2 stud stud 4096 2011-03-10 01:58 Debug -rw-r--r-- 1 stud stud 2048 2011-03-10 01:58 handout.cpp
 * asdf

unknown command
 * exit

code