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…
Bist du sicher, dass das Verzeichnis, auf dass du zugreifen möchtest, überhaupt existiert?
Versuchs mal mit char* c = “./Verzeichnis/Dateiname” oder “.//Verzeichnis/Dateiname”, d.h. geb erstmal das Verzeichnis direkt ein, bevor du da mit Variablen rumhantierst
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
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?
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;
}
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
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.
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.
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.