SP1 Klausur


Vielleicht hilft dir das weiter: c - How do I open a file in such a way that if the file doesn't exist it will be created and opened automatically? - Stack Overflow


mm leider hilft mir das nicht weiter… vorallem weil in der Klausur auch nicht diese HaederDatei die man dafür bräuchte dabei stand wurde…


Hmm, also mit “w” sollte es allerdings auch gehn (bzw. mit “w+”), zumindest laut der Referenz für fopen().

Edit: Um welche Klausur gehts denn überhaupt? Evtl. kannst du ja mal kurz n Codeschnipsel posten.


Es geht um die Klausur von 2011 SP1

void *convertFile(void *arg){
const char *c=(const char *)arg;
FILE *f=fopen(c,“r”);
if(f==NULL){
die(“fopen1”);
}
char name[strlen(a)+2+strlen(c)];//a ist hier eine globale variable, in der das zielverzeichnes steht
sprintf(name,“%s/%s”,a,c);//in name steht jetzt der ganze neue Pfad unter dem die neu angelegte Datei dann zu finden sein soll
FILE *ziel=fopen(name,“w”);
if(ziel==NULL){
die(“fopen2”);
}

f ist die Datei, die ich konvertieren will deswegen öffne ich sie zum lesen, dabei gibt es auch noch keine Probleme. Aber bei dem ziel schon…


  1. Bist du sicher, dass das Verzeichnis, auf dass du zugreifen möchtest, überhaupt existiert?
  2. Versuchs mal mit char* c = “./Verzeichnis/Dateiname” oder “.//Verzeichnis/Dateiname”, d.h. geb erstmal das Verzeichnis direkt ein, bevor du da mit Variablen rumhantierst

Hab noch ne Frage zur (erstmal) Aufgabe 3c, Klausur August 2011:
(Link: http://www4.cs.fau.de/Lehre/SS11/V_SP1/Pruefung/2011s-SP-Klausur-www.pdf)

c1)
a: Datensegment
b: Datensegment
p: Datensegment
i: Stacksegment

c2)
Segfault, aber warum? Keine Ahnung. :V Wenn ich raten müsste, würde ich sagen, weil man eine Adresse nicht dereferenzieren kann?

c3)
Beim Segfault denk ich mal es wird das Beendigungsmodell verwendet. (?)

Stimmen meine Antworten soweit? Welche Daten kommen eigentlich ins Textsegment? Nur direkt Code (also z.B. fork())?


Im Textsegment liegen auch solche Dinge wie:
const char *x=„hallo welt“;
Dann liegt hallo welt auch im Textsegment und x müsste auf dem Stack liegen(wenn das innerhalb einer Methode ist).
Spricht dort liegen auch Programmkonstatnen


Ah ok, daran hab ich garnicht gedacht, an das const. Danke. :smiley:


Ja das verzeichnis existiert ich hab mir es auch bevor ich es öffne nochmal ausgeben lassen… aber leider hab ich den Fehler damit immer noch nicht behoben

Und dann noch zur SP1 Klausur von 2013 bei der Aufgabe 3 bin ich mir auch nicht sicher pb das so stimmt:
b) safty und security ?!? (also einmal schutz von menschen/sachwerten vor Versagen technischer Systeme und Schutz von Informationen vor intelligenten Angreifern (also das man aus dem Segment nicht einfach rauskommt?!?)
oder wisst ihr da was anderes zu?
c3) ist das wirklich auch die MMU, die das merkt?
c4) Trap
c5) Das BS leitet eine AUsnahmebehandlung nach dem Beendigungsmodell ein?


Kannst du evtl. nen Link für die Klausur 2013 posten? Ich finde den Link irgendwie nicht. :confused:


So hier einmal der Link: http://www4.cs.fau.de/Lehre/WS12/V_SP1/Pruefung/2012w-GSP-Klausur-www.pdf

Ich hab jetzt mal die Programmieraufgabe gemacht und die Funktion transcodeVideo und die tstart Funktion würd ich hier mal gern posten, weil ich irgendwie nicht ganu klar komm, wie man das mit den Thread IDs und so machen soll, wenn man zuvor nicht die Anzahl der Threads weiß, genauso wie mit der Anzahl der threadArg, sonst würde ich mir einfach jeweils arrays anlegen, und dann würde das denke ich ganz schön werden, aber hier ?!? (außerdem kann ich sie leider nicht selber ausprobieren, da einem ja die Schnittstelle mit dem Frame fehlern würde…)

static SEM *transcodeVideo(FILE *f){
static SEM *w=semCreate(1);
if(w==NULL){
fprintf(“Fehler bei semCreate\n”);
exit(EXIT_FAILURE);
}
static SEM s=semCreate(0);
if(s==NULL){
fprintf(“Fehler bei semCreate\n”);
exit(EXIT_FAILURE);
}
int i=0;
Frame p[1];
while(fread(&p,sizeof(Frame),1,f)==1)){
threadArg t;
t.waitFor=w; //darf man das einfach so machen, oder wuerden die Semaphoren somit immer ueberschrieben werden?
t.signal=s;
pthread_t id=i;
i++;
errno=pthread_create(&id,NULL,(void * (
) (void ))tstart, (void)t);
if(errno!=0){
perror(pthread_create); //hier kein exit weil dann nur aktueller Frame nach angabe verworfen werden soll ?!?
}
else{
w=s;
SEM *x=semCreate(0);
if(x==NULL){
fprintf(“Fehler bei semCreate\n”);
exit(EXIT_FAILURE);
}
s=x;
}
}
return s;
}

static void *tstart(threadArg *t){
Frame *f=transcodeFrame(t->frame);
P(t->waitFor);
if(fwrite(f,sizeof(Frame),1,stdout)<1){
fprintf(stderr,“Fehler bei fwrite\n”);
}
V(t->signal);
free(f);
}

Muss man ganz am Ende die Semaphoren eigentlich alle wieder frei geben, oder passiert das durch das exit(EXIT_SUCCESS); in der main automatisch?
Und die Threads beenden sich doch automatisch, wenn sie mit der tstart-Funktion fertig sind, dann brauch ich hier also kein join…
Und dann noch: muss eigentlich jeder Thread dann überhaupt eine verschiedene Thread ID haben, wenn ich eh nicht join dann nicht oder?
Wär super nett,wenn jemand schreiben könnte, ob die FUnktionen so passen, oder was daran falsch ist :slight_smile:


Schau dir mal die vorherige Aufgabe an! Das ist ein Page-Fault (Trap) weil das Present-Bit für diese Seite nicht gesetzt ist.

Ein Segfault ist ein Signal, das (normalerweise) den Prozess terminiert.

Aber hier gibt es einen Page-Fault, also muss das Betriebssystem die Seite einlagern, die Seitentabelle aktualisieren und den Befehl wiederholen.

Richtig. Nur der Code.

Bei der Aufgabe sollte man übrigens die Seiten (also z.B. s1, d1, d2, etc.) angeben; siehe vorherige Aufgabe.

Nein. Sowas wie „hallo welt“ kommt ins (read-only) Datensegment. (Welches dann ggf. vom Loader in dieselbe Region gemappt wird, wie das Textsegment, aber das ist für die Aufgabe nicht relevant. Falls dich die Details interessieren, schau dir die ELF-Spezifikation an, besonders die Details über Section- und Program-Headers.)

Nein. Die liegen auch im (read-only) Datensegment. [m]x[/m] liegt natürlich im Stack.


Oh kuhl, Danke rudis! Ich glaube jetzt hab ichs verstanden. :slight_smile:


Nochmal zu den 3 Fragen, da ich mir bei denen auch nicht sicher bin.

a) Würde ich auf drittens tippen
d) Da schwanke ich zwischen dem Zweiten und Vierten
f) Da sage ich auch das Zweite

Was meint ihr?


Die a) und f)würde ich auch so sehen. Bei der d) würde ich das 4. ankreuzen, der Stack-Frame ist ja das Stacksegment im Speicher und ist für lokale Variablen und so weiter da.


Ok, danke!

Müsste bei der h) (Klausur 2010, SP1) nicht die 3 richtig sein?


Was würdet ihr bei dieser Frage ankreuzen… ich würde sagen 1. und 4. und 5. ist richtig…

Gegeben sei folgendes Programmfragment:
static int a;
int f1 (int x, const int* y) {
static int b;
int c;
y++;

}
Welche der folgenden Aussagen zu den Variablen im Programm sind richtig?
❍b ist uninitialisiert und enthält einen zufälligen Wert.
❍Auf a kann von anderen Modulen aus zugegriffen werden.
❍Wenn f1 den Wert von x ändert, so beeinflusst dies den Aufrufer.
❍c verliert beim Rücksprung aus f1 seine Gültigkeit.
❍y kann sowohl auf einen einzelnen int als auch auf ein Array von int s verweisen.
❍Die Anweisung y++ führt zu einem Compiler-Fehler, weil y als const deklariert ist.


Und bei der Klausur Juli 2012 was habt ihr denn da bei der Mehrfachauswahlfrage 1.2 raus?
Ich hätte da 1,4,6,8


  1. ist falsch. Schau dir nochmal an, was static in einer Funktion macht.

Oh ja stimmt ich hab mich da irgendwie zwischen b ubd c verguckt ohoh sowas sollte in der klausur nicht passieren… b wird ja mit 0 initialisiert…