Øvelse+6.1+-++Processes+in+Linux

= Exercise 6.1 = I denne øvelse skal vi lave et program, der opretter en "child process". "child processen" skal udskrive at den er et barn, dens id og returværdi, og det samme skal "parent processen".
 * Exercise 1 **

For at lave en child process skriver vi:

// pid_t pid; // // pid = fork; //

// hvis fork returner 0, er det child processen // // Hvis fork returner noget andet end 0, er det parent processen //

code format="cpp" int main {   pid_t pid; pid = fork;

if (pid == 0) // child process {       std::cout << "I'm a child process" << std::endl; sleep(3); _exit(0); // _exit(0) for at lukke child processen }   else // parent {       wait(0); //venter på child processen std::cout << "i'm the parent process" << std::endl; }   std::cout << "we are done" << std::endl; return 0; } code


 * Exercise 2 **

I denne opgave skulle vi lave en "child process" der skal skrive tick hver 5 sekund, og en "child process" der udskriver tock hver 8 sekund. code format="cpp" if(pid == 0) {  for(int i = 0; i < 5; i++) {  cout << "tick!" << endl; sleep(1); } _exit(1); } code derefter laver vi en fork mere, som gør det samme, bare med 8 sekunder til slut i parent processen kalder vi wait(0) 2 gange, som venter på child processerne bliver done


 * Exercise 3 **

Vi har anvendt filen til at lave opgaven med. I filen er der skrevet main-delen og en funktion, der tokenizer brugerens input (opdeler ord adskilt af mellemrum i et vector-objekt).

For at starte et program i en ny process skal funktionen anvendes i den nye child-process (lavet med . Brugeren input behandles så shell-kommandoerne bliver fundet i /bin/-mappen:

code format="cpp" void executeCommand(string cmd) {   vector commands; commands = tokenize(cmd);

string basepath = "/bin/"; string path = basepath + commands[0]; char* charPath = (char*) path.c_str; char** args = new char*[commands.size + 1];

args[0] = charPath;

int i;

for (i = 1; i < commands.size; i++) {       args[i] = (char*)commands[i].c_str; }

args[i] = NULL;

pid_t pid; int status; pid = fork; if (pid == 0) {       execv(charPath, args); cout << "Unknown command" << endl; _exit(1); }   else {       wait(&status); }   delete[] args; } code