SP1 Klausur

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

SP1 Klausur
Ich hab heute mal die SP1 Klausur von 2010 versucht und würd hier einfach mal gern meine Antworten reinschreiben (vllt findet sich ja jemand, der diese Klausur auch gemacht hat/macht oder einfach so die Antworten weiß):
Aufgabe 1:
a)(kam ja noch nicht in der Vorlesung dran)
b) da hätte ich das erste angekreuzt
c) auch das erste
d)(kam in Vorlesung auch noch nicht dran)
e)hier hätte ich das dritte genommen, da der Prozess doch dann erst in den Zusatnd bereit geht oder?)
f)ich tendiere zu zweitens
g)hier das vierte, weil es stehen zwar Rechte drinnen aber ja nicht explizit für den Besitzer (nur Eigentümer und so…)
h)viertens
i)drittens

Aufgabe 3:
a) das steht ja so in den Folien drinnen
b)auch einfach in Folien
c)Ich hätte irgendwie sowas erwähnt:
-erst führt CPU Kontextwechsel durch (vom unterbrochenen Programm hin zum behandelnden)
-sichert Befehlszähler und Statusregister des unterborchenen Prozesses
-führt die Befehle des behandelnden Programms aus
-falls nicht nach Beendigungmodell behandelt, dann weder Speicherinhalte wieder zurückgeschrieben und ein erneuter Kontextwechsel (diemal andere Richtung) findet statt

Aufgabe 2:
Hier tu ich mich recht schwer und frag mich, wie man das in vllt höchstens 60 Minuten die einem inder Klausur noch zum Programmieren übrig bleiben schaffe soll… ich selber versteh nicht ganz wie das mit den Puffern abläuft und es steht ja auch drauf, dass es dafür eine bekannte Schnittstelle gibt, die ich aber leider irgendwie in den Manpages oder wo auch sonst die in der Klausur vorhanden sein sollen finden kann.
Hat jemand vielleicht einen Tipp wie man in der Klausur in so wenig Zeit das einigermaßen gescheiht schaffen kann?


Richtig.

Doch. Die Rechte stehen in der Inode, Rechte für den Eigentümer, für die Gruppe und für alle anderen:

$ ls -al baz
-rw-r--r-- 1 foo bar 0 Jul  3 00:57 baz
       ^^^ other, Rechte für alle anderen: lesen
    ^^^    group, Rechte für die Gruppe (hier foo): lesen
 ^^^       user,  Rechte für den Eigentümer (hier bar): lesen und schreiben

Was nicht drin steht ist die Inode-Nummer selbst.

Der Rest stimmt.

Falls du mit „Speicherinhalte“ den gesicherten Kontext meinst, dann stimmt das. Ggf. müssen auch noch einige Register gesichert werden.

Die Manpages scheinen zu fehlen. Gemeint ist der bounded buffer.

Viel üben. Die Übungsaufgaben nochmal programmieren, alte Klausuren (auf dem Zettel) programmieren, etc. - auch ist es sehr nützlich sich die wichtigen Code-Ausschnitte (fork, threads, readdir, etc.) auf den Spickzettel zu schreiben.


Danke für deine Antwort :slight_smile:
mm aber noch mal zur Aufgabe 1g)
Wenn ich mir anschaue was mir lstat in der struct stat(was doch der Dateikopf ist… oder hab ich das falsch verstanden?!?)
anschaue, dann steht dort laut der man page doch auch die Inodenummer drinnen…


In der [m]struct stat[/m] stehen hauptsaechlich, aber nicht ausschliesslich Informationen aus dem Inode.
Die Inodenummer entspricht den Offset der Inode in der Inodetabelle (Siehe http://www4.cs.fau.de/Lehre/SS13/V_SP1/Vorlesung/Folien/SP1-061-A4.pdf Folie 26). Im Inode selbst haette diese Informationen keinen Wert, denn man muss diese Nummer haben um ans Inode ranzukommen.


Danke, jetzt weiß ich also in der Hinsicht Bescheid :slight_smile:
Jetzt habe ich mal die Klausur von 2011 gemacht, und würde dazu auch gern einfach mal meine Antworten posten:

Aufgabe 1.1:
a) erstens
b) viertens
c)viertens
d)drittens
e)zweitens
f)erstens
g)drittens(war ja schon in der anderen klausur)

Aufgabe 1.2:
erstens, fünftens,siebtens und achtens
SInd hier die User-Threads die Federgewichtigen und die Kernthreads die Leichtgewichtigen?

Aufgabe 3:
a) muss man hierbei in dem logischen Adressraum dann immer nur die Variable schreiben oder auch den Wert den sie hat, falls sie mit einem initialisiert wird? Also wenn ich in der Funktion eine lokale Variable int a =5 hab schreib ich dann in den STack a oder a=5?

b) safty und security

c1)Segmentation fault

c2)Weil man einem Zeiger eine negative Speicheradresse zuordnet und solche eine im logischen Adressraum nicht vorhanden ist.

c3)MMU

c4)die MMU schickt einen Trap an das BS?

c5) das BS beendet diesen Prozess

Aufgabe4:
Das ist doch eigentlich wieder nur der Kontexwechsel und die Speicherung von Befehlszählern, Register,… und etwas drum erklärt wie das funktioniert…
Vielleicht findet sich ja wieder jemand der das mal anschaut :slight_smile:


[quote=???]SInd hier die User-Threads die Federgewichtigen und die Kernthreads die Leichtgewichtigen?[/quote]Ja.

[quote=???]a) muss man hierbei in dem logischen Adressraum dann immer nur die Variable schreiben oder auch den Wert den sie hat, falls sie mit einem initialisiert wird? Also wenn ich in der Funktion eine lokale Variable int a =5 hab schreib ich dann in den STack a oder a=5?[/quote]Ich denke nur der Name reicht. Bei diesen Aufgaben ging es immer darum, zu wissen, welche Variable wo liegt. Das im BSS uninitialisierte Daten liegen sollte ja bereits im Freitext oben stehen.

[quote=???]c2)Weil man einem Zeiger eine negative Speicheradresse zuordnet und solche eine im logischen Adressraum nicht vorhanden ist.[/quote]Falsch. Weil der Nullpointer dereferenziert wird, der im Adressraum auf eine Seite zeigt, die das Betriebssystem für diesen Prozess nicht gemappt hat (die 0. Seite ist immer ungemappt).


Danke für deine Anwort:) ja das mit dem Nullpointer derefernezieren stimmt, da hab ich irgendwie falsch gedacht.
Ich hab mal wieder 2 Fragen und würd gern wissen, ob die Antworten so stimmen:

1.) Wie wird im System bei einem Speicherzugriff erkannt, das die entsprechende Speite ausgelagert ist?
Die MMU merkt, dass die Seite nicht in den physikalischen Speicher eingeblendet ist und sendet einen Trap (pagefault) an das BS. Aber wie genauf merkt die MMU, dass die Seite nicht
eingebleindet ist, schaut die MMU un der Pagetable, wo die Deskriptoren stehen nach?

2.)Was läuft im System nach dieser Erkennung ab? Beschreiben sie die einzelnen Schritte, die im BS abgewickelt werden um den Speicher verfügbar zu machen und geben sie an, welche
Prozesszustände der auslösende Prozess dabei jeweils einnimmt.
Der Prozess wird zuorst blockiert. Die MMU schickt einen Trap an das BS und das BS schaut in der Pagetable nach, wo sich die ausgelagerte Seite befindet. Dann, falls kein Platz im
physikalischen Speicher ist, lagert das BS entsprechende Teile aus diesem Speicher aus und ändert im jeweiligen Prozess in der Pagefault die Daten, damit man weiß wo die ausgelagerte
Seite/Teile liegen. Dann läd das BS die angeforederte ausgelagerte Seite in den physikalischen Speicher und ändern in der Pagetable wieder die Daten. Dann gibt das BS der MMU ein
Signal, dass Seite jetzt eingelagert. Prozess geht in Zusatnd blockiert und wartet auf Prozessorzuteilung.

Und waren die Ankreuzaufgaben, die ich das letzte mal reingestellt hab richtig?


Andersrum: Es wird versucht, die Seite zu adressieren, die MMU merkt im Pagetable, dass die Seite nicht da ist. Deshalb schickt sie den Pagefault ans BS und das BS blockiert den Thread. Das sollte auch die 1.) beantworten.

Nope, wenn das BS den Pagetable angepasst hat ist die MMU schon vollkommen zufrieden, sie tut an der Stelle aber nichts.

Das Betriebssystem sorgt noch dafür, dass beim fortsetzen des Prozesses der Seitenzugriff wiederholt wird - jetzt sollte die Seite da sein und der Zugriff kann ausgeführt werden.


Danke für die Antwort. Was mir noch nicht ganz klar ist: Hat also sowohl die MMU als auch das BS Zugriff auf die Pagetable? Und die Deskriptoren von den jeweiligen Seiten stehen die dann auch in der Pagetable? Und verwendet die MMU die Deskriptoren dann nur zum Adressraumschutz?


Der Pagetable liegt im Hauptspeicher und da drin rumschreiben tut eigentlich nur das Betriebssystem. Es gibt ein spezielles Register, durch das die MMU (bzw. deren Cache) weiß, wo dieser liegt. Die MMU liest dann einfach nur die Adressen. Da die 64bit aber nicht komplett für die Adresse benötigt werden, wird ein Teil der Bits dazu verwendet, bestimmte Flags zu setzen (ReadOnly, Present, …). Von den Flags gibts noch ein paar mehr. Der Adressraumschutz ist quasi implizit durch die Seitentabelle gegeben - denn alle Seiten, die da nicht drin stehen, sind auch nicht zugreifbar.


Ah okay, also hat die MMU doch Zugriff auf die Pagetable, dann wurde es mir vor kurzen iwie falsch erklärt :wink: Da glaub ich lieber euch hier :slight_smile:
Und dann noch allgemein beim Programmieren mal ne Frage:
Wenn ich irgendwie etwas in einem schon geöffneten Verzeichnis machen soll, und ich such z.B. alle regulären Dateien in diesem Verzeichnis, dann verwende ich ja lstat.
Nur irgendwie hab ich da weng rumprogrammiert mit und versteh folgendes nicht:
Ich muss ja lstat einen Pfad übergeben, wenn ich aber nur ein geöffnetes Verzeichnis übergeben bekomme, also ein DIR *, wie kann ich dann auf den Pfadnamen dieses Verzeichnisses zugreifen? Weil für lstadt kann ich doch nicht nur den Namen der Datei verwenden, weil dann wird die Datei ja auch im aktuellen Arbitsverzeichnis gesucht und nicht in dem geöffneten, aber das will ich ja nicht… Jemand ne Idee?


Das kommt darauf an. Sie muss nicht zwangsweise Zugriff auf die Pagetable haben. Bei einigen Architekturen gibt es einen Trap falls eine lineare Adresse nicht im TLB ist und das Betriebssystem muss die passende physikalische Adresse in den Pagetables finden. Aber es muss eine Möglichkeit für das Betriebssystem geben, der MMU Informationen über den logischen Adressraum (was in den Pagetables steht) zu übermitteln.

Das kommt auf die Aufgabe an. Manchmal ist auch ein [m]stat(2)[/m] korrekt. Da heißt es die Aufgabenstellung exakt zu lesen.

Ja, das funktioniert so direkt nicht. Es gibt zwar [m]openat(2)[/m] und co., aber die sind nicht relevant für SP.

Du brauchst als Argument noch den Pfad zum Verzeichnis, sonst kannst du die Datei nicht staten/öffnen.


Ein ganz fieser Trick dafür, der in einigen SP-Klausuren durchaus anwendbar und korrekt war, ist beim [m]opendir(3)[/m] gleich auch noch ein [m]chdir(2)[/m] zu machen und dann beim [m]stat(2)[/m] einen relativen Pfad zu benutzen. Das geht natürlich immer dann nicht mehr, wenn man mit verschiedenen [m]DIR *[/m] gleichzeitig arbeiten muss.

Oh, und dann gäbe es da noch [m]fstatat(2)[/m]. Den dafür nötigen [m]dirfd[/m] bekommt man mittels [m]dirfd(3)[/m]. Tatsächlich ist die Verwendung der [m]*at[/m]-Funktionen eigentlich sinnvoller, weil sich damit eine Race Condition die durch die Umbenennung des Verzeichnisses entstehen könnte vermeiden lässt; in der Praxis sieht man sie aber quasi nie.


gibt es eigentlich irgendwo die Klausuren von 2005 bis 2009 für SP1 oder seh ich das richtig, dass man von den Programmieraufgaben eigentlich eh nur die aus den letzten 2 Jahren nehmen kann, weil wir das davor was in dennen drankam nicht gemacht haben?


Und dann mal noch zu ein paar ankreuzaufgaben:
Welche Aussage zum Thema Betriebsarten ist richtig?
❏Beim Stapelbetrieb können keine globalen Variablen existieren, weil alle Daten im Stapel-Segment (Stack) abgelegt sind.
❏Echtzeitsysteme findet man hauptsächlich auf großen Serversystemen, die eine enorme Menge an Anfragen zu bearbeiten haben.
❏Mehrzugangsbetrieb ist nur in Verbindung mit CPU- und Speicherschutz sinnvoll realisierbar.
❏Mehrprogrammbetrieb ermöglicht die simultane Ausführung mehrerer Programme innerhalb desselben Prozesses.
Hier würde ich sagen das dritte ist richtig…wenn das vierte richtig wäre müsste es doch die Ausführung mehrere Programme in verschiedenen Prozessen heißen oder?

Welche Aussage zum Thema Prozesse/Threads ist richtig?
❏Beim federgewichtigen Prozess bilden Adressraum und Prozess eine Einheit.
❏Leichtgewichtige Prozesse müssen vom Betriebssystem speziell unterstützt werden.
❏Eine gleichzeitige Ausführung mehrere schwergewichtiger Prozesse auf verschiedenen Prozessoren ist nicht möglich.
❏Die Einlastung eines federgewichtigen Prozesses ist eine privilegierte Operation und erfordert Unterstützung der Betriebssystem.
Hier würde ich das zweite nehmen

Namensräume dienen u. a. der Organisation von Dateisystemen. Welche Aussage ist richtig?
❏Flache Namensräume sind besonders einfach implementierbar und damit vor allem für Mehrbenutzersysteme gut geeignet
❏Flache Namensräume erlauben pro Benutzer nur einen Kontext
❏Der Nachteil von hierarchischen Namensräumen besteht darin, dass das Dateisystem spezielle Funktionen zum Auflösen von Namenskonflikten implementieren muss
❏In einem hierarchisch organisierten Namensraum dürfen gleiche Namen in unterschiedlichen Kontexten enthalten sein
Hier das vierte

Was versteht man unter Virtuellem Speicher?
❏Speicher, in dem sich keine Daten speichern lassen, weil er physikalisch nicht vorhanden ist.
❏Speicher, der nur im Betriebssystem sichtbar ist, jedoch nicht für einen Anwendungsprozess.
❏Speicher, der einem Prozess durch entsprechende Hardware (MMU) und durch Ein- und Auslagern von Speicherbereichen vorgespiegelt wird, aber möglicherweise größer als der verfügbare physikalische Hauptspeicher ist.
❏Unter einem Virtuellen Speicher versteht man einen physikalischen Adressraum, dessen Adressen durch eine MMU vor dem Zugriff auf logische Adressen umgesetzt werden.
Hier das dritte

Welche der folgenden Aussagen zu statischem bzw. dynamischem Binden ist falsch?
❏bei dynamischem Binden werden alle Adressen zum Bindezeitpunkt aufgelöst
❏bei dynamischem Binden können auch zum Übersetzungszeitpunkt alle bekannten Adressbezüge bereits vollständig aufgelöst werden
❏beim statischen Binden werden alle Adressen zum Bindezeitpunkt aufgelöst
❏statisch gebundene Programme können zum Ladezeitpunkt an beliebige Speicheradressen platziert werden
das erste weil es sind doch nochnicht aufgelöste Adressen vorhanden oder?

Bei der Behandlung von Ausnahmen (Traps oder Interrupts) unterschei-
det man zwei Bearbeitungsmodelle. Welche Aussage hierzu ist richtig?
❏Das Wiederaufnahmemodell dient zur Behandlung von Interrupts (Fortführung des Programms nach einer zufällig eingetretenen Unterbrechung). Bei einem Trap ist das Modell nicht sinnvoll anwendbar, da ein Trap ja deterministisch auftritt und damit eine Wiederaufnahme des Programms sofort wieder den Trap verursachen würde.
❏Interrupts dürfen auf keinen Fall nach dem Beendigungsmodell behandelt werden, weil überhaupt kein Zusammenhang zwischen dem unterbrochenen Prozess und dem Grund des Interrupts besteht.
Hier bin ich mir zwischen diesen beiden Antworten nicht sicher ich würde das zweite sagen weil ja Interrupts nicht nach dem Beendigungsmodell behandelt werden dürfen aber der Satz dahinter verunsichert mich…

Welche der folgenden Aussagen bzgl. Threads ist falsch?
❏Die Einlastung (das Dispatching) eines Threads ist eine privilegierte Operation und kann deshalb grundsätzlich immer nur durch das Betriebssystem vorgenommen werden.
❏Das Betriebssystem ist nicht in der Lage, einen einzelnen User-Level Thread bei einer fehlerhaften Operation (z. B. Segmentation fault) gezielt abzubrechen.
❏Ein Anwendungsprogrammierer kann die Schedulingstrategie für seine UserLevel Threads selbst programmieren.
❏Die Erzeugung eines Kernel-Level Threads ist teurer als die Erzeugung eines User-Level Threads.
Hier das erste

Wie funktioniert Adressraumschutz durch Eingrenzung?
❏Begrenzungsregister legen einen Adressbereich im logischen Adressraum fest, auf den alle Speicherzugriffe beschränkt werden.
❏Begrenzungsregister legen einen Adressbereich im physikalischen Adressraum fest, auf den alle Speicherzugriffe beschränkt werden.
Bei der Segmentierung wäre es doch der logische Adressraum bei Eingrenzung und Abteilung der physikalische oder?

Sie kennen den Begriff Demand-Paging. Welche Aussage dazu ist richtig?
❏Demand-Paging setzt eine segmentierte Speicherverwaltung voraus.
❏Demand-Paging benötigt keinerlei Hardware-Unterstützung, da sich alle benötigten Mechanismen auch ohne MMU realisieren lassen.
❏Demand-Paging erlaubt es größere logische Adressräume anzulegen, als Hauptspeicher vorhanden ist. Allerdings muss vorausgesetzt werden, dass ein Prozess nicht alle Seiten des logischen Adressraums tatsächlich anspricht.
❏Demand-Paging lädt eine Seite erst dann in den Hauptspeicher, wenn sie tatsächlich angesprochen wird. Nicht benutzte Seiten werden unter Umständen aus dem Hauptspeicher ausgelagert
Hier würde ich das vierte nehmen, aber geht diese Verfahren auch bei anderen Speicherverwaltungen nicht nur bei Segmentierung?

Ein Betriebssystem setzt logische Adressräume auf der Basis von Segmentierung ein. Welche Aussage ist falsch?
❏Die Segmentierung schränkt den logischen Adressraum derart ein, dass nur auf gültige Speicheradressen erfolgreich zugegriffen werden kann.
❏Über gemeinsame Segmente kann innerhalb von zwei verschiedenen logischen Adressräumen auf die selben Speicherzellen zugegriffen werden.
❏Mit der Segmentierung kann einem Prozess mehr Speicher zugeordnet werden als physikalisch vorhanden ist, da ein Segment teilweise ausgelagert werden kann.
❏Segmente können verschiedene Länge haben. Eine Längenbegrenzung wird üblicherweise bei der Speicherabbildung geprüft.
Hier würde ich das dritte nehmen, weil dafür braucht man doch den virtuellen Speicher und nicht nur die Segmentierung oder?

Welche Aussage bezüglich der Freispeicherverwaltung mittels einer nach Blockgröße sortierten verketteten Liste ist falsch?
❏Der Suchaufwand ist konstant.
❏Eine Verschmelzung benachbarter Freispeicherbereiche ist aufgrund der Sortierung besonders einfach möglich.
❏Bei einer Speicheranforderung muss die Liste u.U. vollständig durchlaufen werden.
❏Die Datenstruktur eignet sich besonders zur Realisierung einer worst-fit Strategie
mm hier hab ich leide rkeine Ahnung, nur das 2. und dritte würde ich ausschließen…

Mit logischen Adressräumen kann man mehrere Zwecke erreichen. Was gehört nicht dazu?
❏Sicherheit: man kann unbefugten Zugriff auf Daten verhindern.
❏Schutzmechanismus: man kann die Auswirkungen von Berechnungsfehlern oder technischen Fehlern (wie z. B. Bitkipper) begrenzen.
❏Virtualisierung: man kann in einem Programmlauf mehr Speicher nutzen, als physikalisch vorhanden ist.
❏bessere Verwaltung: man kann Speicherbereiche mit unterschiedlicher Bedeutung voneinander abgrenzen.
Hier das letzte, weil das Segmentierung wäre?

User-Level- und Kernel-Level-Threads unterscheiden sich in verschiedenen Eigenschaften. Welche Kombination ist richtig?
❏Bei User-Level-Threads können anwendungsabhängig Schedulingstrategien eingesetzt werden; Kernel-Level-Threads können Multiprozessoren nicht ausnutzen.
❏Kernel-Level-Threads werden am effizientesten umgeschaltet; User-Level-Threads blockieren sich bei blockierenden Systemaufrufen gegenseitig.
❏Bei Kernel-Level-Threads ist die Schedulingstrategie meist vorgegeben; User-Level-Threads können Multiprozessoren ausnutzen.
❏User-Level-Threads werden effizient umgeschaltet; blockierende Systemaufrufe von Kernel-Level-Threads blockieren keine anderen Threads
Hier klingt irgendwie 1 und 4 richtig…

So es ist leider ein wenig mehr geworden…
Hoffe trotzdem, dass jemand seinen Kommentar zu abgibt :slight_smile:


Nein, die gibt’s nicht, weil vor 2010 SP immer innerhalb eines Semesters gemacht wurde, es also keine einzelne SP1-Klausur gab.


@???: Diese Fragen sind schon (fast) alle beantwortet worden (in meinem Post da mit den Multiple-Choice Aufgaben).


Ich hätte da auch ne Frage:

Klausur Februar 2012, Aufgabe 3a:
(http://www4.cs.fau.de/Lehre/WS11/V_SP2/Pruefung/2011w-SP-Klausur-www.pdf)

Meine (groben) Antworten:
a1)
pthread:

  • Mutexe
  • Joins
  • Cond_Var

Monitor:

  • Kapselung, Datenabstraktion, Bauplan durch Monitorkonzept (= Modul) → Abstrakter als phtread
  • Von Proz. gemeinsam genutzte Daten zu einer Einheit zusammengefügt
  • Programmierer muss sich nicht mehr explizit um die Art der Synchronisation kümmern

a2)

  • Schlossvariablen o. Semaphore (bevorzugt)
  • Bedingungsvariable
  • Monitor-Operationen werden unter wechselseitigem Ausschluß ausgeführt

Im Bezug auf Hansen/Mesa:

  • Hansen: block. Bed.var.; gibt dem Signalnehmer Vorrang → Signalisierung lässt den Signalgeber den Monitor verlassen, nachdem er alle Signalnehmer auf “bereit” gesetzt hat
  • Mesa: nichtblock. Bed.var.; gibt dem Signalgeber Vorrang → Signalisierung lässt den Signalgeber im Monitor fortfahren, nachdem er einen oder alle Signalnehmer auf “bereit” gesetzt hat

a3) einseitige/mehrseitige Synchronisation (also ähnlich wie a2), nur im Kontext der eins./mehrs. Synchr. erklärt)

Prinzipiell verstehe ich da nicht was genau mit Monitor-Synchronisationsmechanismen gemeint ist, in den Folien habe ich dazu auch keine wirklichen Erläuterungen gefunden. Kann mir da evtl. jmd. weiterhelfen?


Danke R3count, das wusste ich nicht, das es sowas gibt, dann werde ich da mal schauen.

Ich hab auch noch eine andere Frage zur SP1 Klausur von 2011:
Ich hab das Programm jetzt mal geschrieben, aber ich bekomme immer, wenn ich mir eine neue Datei erstellen will einen Fehler und zwar meine Vorgehensweise:
Ich hab eine Datei mit Name z.B. “foo.c” im aktuellen Arbeitsverzeichnis. Jetzt möchte ich diese Datei erstmal zum lesen öffnen, das hab ich mit
FILE *f=fopen(“foo.c”,“r”) gemacht und jetzt möchte ich in einem anderen Verzeichnis mit dem Pfad pfad eine gleichnamige Datei anlegen. Also habe ich erstmal foo.c mit einem / davor an pfad gehängt und diesen neuen Pfad in pfad_neu gespeichert und jetzt möchste ich solch eine Datei erstellen, mach ich das nicht einfach mit
FILE *ziel=fopen(pfad_neu, “w”) ?!?
Oder wie muss ich mir das anlegen?