Daniel's Tech Blog

Cloud Computing, Cloud Native & Kubernetes

Drittes BS1 Praktikum

Leider etwas verspätet, aber besser spät als nie. Hier die Lösungen zum dritten BS1 Praktikum:

In Aufgabe 2 sollte der folgende Programmcode mit den dazu vorgegebenen Befehlen ausgeführt werden:

#include <stdio.h>
#include <unistd.h>
int main () {
printf(“Textausgabe vor dem Forkn”);
fork();
printf(“Textausgabe nach dem Forkn”);
return 0;
}

Befehle:

./a.out
./a.out | cat

Es galt dann die Problemstellung zu lösen, wie für beide Befehle dieselbe Ausgabe zu realisieren sei. Die Lösung ist dabei ziemlich simpel, in dem man einfach eine Pufferentleerung vor dem fork() durchführt.

#include <stdio.h>
#include <unistd.h>
int main () {
printf(“Textausgabe vor dem Forkn”);
fflush(stdout);
fork();
printf(“Textausgabe nach dem Forkn”);
return 0;
}

Die Lösung zu Aufgabe 3 sieht wie folgt aus:

#include<stdio.h>
#include<sys/wait.h>
#include<unistd.h>

void ausgabe(int x){
int i;
for(i=0; i<20; i++){
printf(“%d”, x);
usleep(1000);
fflush(stdout);
}
}

int main() {
if(fork()==0){
ausgabe(0);
}
else if(fork()==0){
ausgabe(1);
}
else if(fork()==0){
ausgabe(2);
}
else{
waitpid(-1, NULL, 0);
waitpid(-1, NULL, 0);
waitpid(-1, NULL, 0);
printf(“nfertign”);
}
return 0;
}

Hier sollten jeweils 3 Kindprozesse erzeugt werden, die zwanzig mal eine 1, 2 und 3 ausgeben. Nach jedem Durchlauf der Schleife wird 1 ms gewartet und eine Pufferentleerung durchgeführt. Der Vaterprozess wartet mittels waitpid() auf das Ende der Kindprozesse.

Zuletzt wurde eine Prozess-Synchronisation mittels pipe programmiert. Das Programm soll nur zwei Parameter als Übergabe zulassen und ansonsten eine Fehlermeldung ausgeben!

#include<stdio.h>

int main(int argc, char *argv[]){

int pipe_connect[2];
if(pipe(pipe_connect)==-1){
printf(“Fehler beim Erzeugen der Pipe”);
return -1;
}
if(argc>3){
printf(“Zu viele Parameter!n”);
return -1;
}
if(fork()==0){
dup2(pipe_connect[1], 1);
close(pipe_connect[0]);
execlp(argv[1], argv[1], 0);

printf(“Der Aufruf 1 ist fehlgeschlagen!”);
return -1;
}
else if(fork()==0){
dup2(pipe_connect[0], 0);
close(pipe_connect[1]);
execlp(argv[2], argv[2], 0);

printf(“Der Aufruf 2 ist fehlgeschlagen!”);
return -1;
}
else{
close(pipe_connect[0]);
close(pipe_connect[1]);
wait(0);
wait(0);
}
return 0;
}


Posted

in

WordPress Cookie Notice by Real Cookie Banner