Virtuelles File System in C schreiben
-
Amoeba/Sprite/Plan9 sind verteilte (experimentelle) Betriebssysteme mit verteilten Dateisystemen. Gibt es auf Citeseer oder sonstwo jede Menge akademische Dokumente darüber. Damit kannst du eine dir eine gewisse Ahnung vom Problemunfang einlesen. Apache Hadoop für Java ist ein verteiltes Dateisystem für Terra bis Petabyte. Da kannst dur dir auch etwas einlesen, um Ideen zu bekommen oder Problemfelder zu bekommen.
Ich fürchte das Ganze dürfte eine Nummer zu groß werden. Du kannst vielleicht einen simplistischen Prototyp erstellen um das konzeptionell anzureißen, weil du das Themengebiet besser verstehen willst. Aber ob es das bringt ..
-- Saxo
-
@Saxo: ich les jetzt nirgends raus, dass er ein komplexes verteiltes Dateisystem implementieren will. Ich les da immer noch eher raus, dass er einen trivialen Container bauen will.
-
Mechanics schrieb:
@Saxo: ich les jetzt nirgends raus, dass er ein komplexes verteiltes Dateisystem implementieren will. Ich les da immer noch eher raus, dass er einen trivialen Container bauen will.
Ach so, dann verstehe ich nicht wofür das ist ...
-
Es geht bei der Aufgabe darum eine Konsolenanwendung zu schreiben, welche ein "VFS" erzeugt, in diesem Fall eine Datei fester größe in der die Daten gespeichert sind (Speicher) und eine Datei variabler Größe in der die Attribute stehen (Verwaltung) wie z.B. der Dateiname, die Stelle in der Speicherdatei an der die Daten stehen, Dateilänge etc.
Es sollen mehrere Befehle möglich sein:
Create soll ein solches VFS initialisieren, d.h. diese zwei Dateien erstellen
Add soll den Inhalt einer Datei in die Speicherdatei schreiben und Attribute zu dieser Datei in die Verwaltungsdatei
Free gibt den freien Speicherplatz wieder
Used gibt den belegten Speicherplatz wieder
Get soll bestimmte Daten aus der Speicherdatei auslesen und in eine einzelne Datei "output" schreiben
Und noch einiges mehr.. Bin wie man vielleicht unschwer erkennen kann auch an dieser Aufgabe dranDie Befehle create,add, etc. musst du halt als Argument aus der Kommandozeile einlesen und in der main-Methode abfragen und die gewünschte Funktion ausführen. Hilfreich dazu ist vll http://openbook.galileocomputing.de/c_von_a_bis_z/013_c_kommandozeilenargumente_001.htm#mjf6a9e42fa3bc25b2b1e06270e7bf8f68
Damit die Speicherdatei eine feste Größe hat hab ich einfach mit malloc einen Speicherplatz der eingegebenen Größe reserviert und in die Datei geschrieben, stoße da aber auf Probleme bei sehr großen Werten. Für die Funktionen free und used musst du halt die Größen der Dateien in der Verwaltungsdatei auslesen und zusammenrechnen, dazu könntest du dir vielleicht mal anschauen wie man Strings zerteilt dann sollte das auch klappen
-
Suchst du einfach nur tar?
http://en.wikipedia.org/wiki/Tar_(computing)
(Oder auch eine anderes Archiv? Siehe weiterführende Links)Kann man selber implementieren, sollte auch nicht zu schwer sein. Man kann natürlich auch den bequemen Weg gehen und den fertigen High-Tech-Reifen montieren, anstatt ein grob gehauenes Steinrad.
Hilfreich dazu ist vll http://openbook.galileocomputing.de/c_von_a_bis_z/013_c_kommandozeilenargumente_001.htm#mjf6a9e42fa3bc25b2b1e06270e7bf8f68
"Hilfreich" und "Galileo Computing" und erst recht "C von A bis Z" gehen nicht zusammen. Vergiss die Seite lieber ganz schnell, ebenso alle Bücher von dem Autor und die meisten Bücher von dem Verlag.
Autor, Verlag und Seite sind bekannt als Ursache vieler Fehler, die hier im Forum auftauchen.
-
SeppJ schrieb:
"Hilfreich" und "Galileo Computing" und erst recht "C von A bis Z" gehen nicht zusammen. Vergiss die Seite lieber ganz schnell, ebenso alle Bücher von dem Autor und die meisten Bücher von dem Verlag.
Autor, Verlag und Seite sind bekannt als Ursache vieler Fehler, die hier im Forum auftauchen.Ach, das Buch ist doch recht erheiternd. Aus dem Link:
/* 1.Zahl in einen Integer konvertieren*/ erg = strtol(argv[1], NULL, 10); if( erg == 0 ) { printf("Keine gültige Ganzzahl ... \n"); return EXIT_FAILURE; }
Und der Witz ist, dass es sich bei diesem Programm um einen Taschenrechner handelt. Der leider nicht mit 0 rechnen kann
-
Ich denke nicht das wir tar-Archive verwenden sollen, es ist angegeben die Speicherdatei mit der Endung .store anzulegen. Zu der Lektüre kann ich nicht allzu viel sagen, aber zum Teil hab ich dort schon gut brauchbare Infos erhalten.
-
filzstift schrieb:
Ich denke nicht das wir tar-Archive verwenden sollen, es ist angegeben die Speicherdatei mit der Endung .store anzulegen.
Ja und? Das ist dasselbe in grün. Ihr sollt also ein tar schlecht nachprogrammieren.
-
Mag sein, wie würde man denn da mit der Speicherung der Dateien vorgehen? In welchem Format kann ich die in dieser .store Datei abspeichern und nachher auch wieder korrekt auslesen? Die Struktur ist in Blöcke fester Größe an Bytes aufgeteilt
-
@filzstift: wer bist du denn? scheint wir sind grad an derselben aufgabe
@alle anderen: es wäre wohl etwas zu umfangreich die ganze aufgabenstellung hier zu posten, da sie knapp 8 seiten lang ist.
Ich würde lieber einzelne Fragen posten, mit denen ich nicht weiterkomme.
Der Zeitrahmen geht bis 14. Oktober allerdings möchte ich es schon beim ersten Termin abgeben und das ist der 7.7.im Moment habe ich das Problem, dass ich Microsoft Visual Studio C++ Express installiert habe und darauf meine Anwendung nicht läuft leider.
Der Code sieht im Moment so aus:
[code="c"]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
int create(char *pfad, int size, int count);
int add(char *pfadVFS, char *source, char *target);int main(int argc, char *argv[]) {
int rueckgabe = 0;printf("Kommt in der main an");
// Eingabefunktion überprüfen
if(strcmp(argv[2], "CREATE")) {
printf("Erkennt den CreateBefehl");
rueckgabe = create(argv[1], atoi(argv[3]), atoi(argv[4]));
}
if(strcmp(argv[2], "ADD")) {
rueckgabe = add(argv[1], argv[3], argv[4]);
}
else {
rueckgabe = 1;
}
scanf("Beliebige Taste drücken für weiter");
return rueckgabe;
}
[/code="c"]Ich bin so vorgegagen:
Neues Projekt >> Win32-Projekt >> Name eingeben >> OK >>
Dann kommt so ein Text: "Dies sind die aktuellen Projekteinstellungen:
Windows-Anwendung
Klicken Sie auf Fertig stellen in einem beliebigen Fenster, um die aktuellen Einstellungen zu bestätigen. "> Zusätzliche Optionen: Leeres Projekt
neue Quelldatei erzeugen: code einfügen
rechtsklick auf das Projekt >> Einstellungen >> Debuggen >> Befehlsargumente mitgeben: pfad CREATE zahl zahl
Dann wollte ich das Programm laufen lassen aber es kommt folgende Meldung:
1>MSVCRTD.lib(crtexew.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_WinMain@16" in Funktion "___tmainCRTStartup".
1>c:\test\eigene dateien\visual studio 2010\Projects\VFS\Debug\VFS.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Anscheinend stimmt was bei den Einstellungen nicht. Aber was??
Habe auch schon versucht mainCRTStartup als Einstiegspunkt mitzugeben. Funktioniert nicht.
-
ich habe gerade versucht unter
Linker >> System >>Subsystem von /SUBSYSTEM:WINDOWS auf /SUBSYSTEM:CONSOLE umzustellendann kommt er zwar bis zur main aber nicht weiter:
"VFS.exe": "C:\test\Eigene Dateien\Visual Studio 2010\Projects\VFS\Debug\VFS.exe" geladen, Symbole wurden geladen.
"VFS.exe": "C:\WINNT\system32\ntdll.dll" geladen, Cannot find or open the PDB file
"VFS.exe": "C:\WINNT\system32\kernel32.dll" geladen, Cannot find or open the PDB file
"VFS.exe": "C:\WINNT\system32\msvcr100d.dll" geladen, Symbole wurden geladen.
Das Programm "[3372] VFS.exe: Systemeigen" wurde mit Code -858993460 (0xcccccccc) beendet.
-
ich habe nun in der add-Funktion, die vorher leer war ein
"return 0" hinzugefügt.Jetzt kommt zwar kein Fehler mehr, aber das Programm läuft trotzdem nicht.
Wenn ich mir den Inhalt von argv[2] angeben lasse dann steht da zwar "CREATE" aber er kommt niemals in der create-Methode meines Programmes an
-
Bei dieser Zeile:
if(strcmp(argv[2], "CREATE"))scheint es nicht weiterzugehen.
-
C_Mond schrieb:
Bei dieser Zeile:
if(strcmp(argv[2], "CREATE"))scheint es nicht weiterzugehen.
Die Funktion strcmp() gibt bei Gleichheit der Zeichenketten den Wert 0 zurück. Und 0 wird zu false ausgewertet ... na, macht's Klick?!
Deine Zeile muss so lauten:
if (strcmp(argv[2], "CREATE") == 0)
oder auch so:
if (!strcmp(argv[2], "CREATE"))
-
@DonChunior:
Danke
-
am Anfang wird ein Pfad mitgegeben und ich brauche diesen Pfad zweimal, einmal um die store-Datei zu erstellen und einmal um die structure-Datei zu erstellen...
ich hatte zuerst den pfad am Anfang in zwei charArrays gepackt:
char *pfadStore = pfad;
char *pfadStructure = pfad;Das funktioniert aber nicht vermutlich weil pfad nur ein Zeiger ist und die beiden anderen auch Zeiger, sodass alle 3 auf den gleichen Speicherplatz zeigen.
Wie bekomme ich das nun hin?
Ich hab auch schon versucht zuerst einfach den pfadStore zu benutzen und dann an die länge-6 ".structure" zu schreiben >> funktioniert auch nicht
-
...
-
Hallo, ich bin nun auf ein anderes Problem gestoßen.
Wie kann ich die Eingabedatei einlesen und dann an eine bestimmte Stelle in meiner .store-Datei schreiben?Das mit der Stelle klappt glaube ich schon mit fseek(). Aber der Inhalt kommt nicht richtig rüber. Ich habe dann erstmal versucht die eingelesenen Inhalte auf der Konsole auszugeben.
fgetc(): da wird immer nur SOH ausgegeben
fread(puffer, 5, 2, eingabe):
Erster Aufruf: Es landen die ersten 10 Zeichen im puffer aber danach kommen noch andere Zeichen und dann nochmal der komplette Inhalt, also ungefähr so:
"Das ist di|<|||||||<|||>Das ist die Eingabedatei"
Zweiter Aufruf: Es landen die nächsten 10 Zeichen im Puffer und wieder noch andere Zeichen: "e Eingabed|<|||||||<|||>Das ist die Eingabedatei"
Dabei ist der puffer bei mir nur 10 Zeichen groß.fgets(): Der Inhalt wird richtig auf der Konsole ausgegeben aber das kann ich leider nicht benutzen weil ich nicht weiß wie lang eine Zeile ist und die Vorgabe ist, dass wir beliebig große Dateien einlesen müssen.
-
1. Das mit dem Einlesen funktioniert jetzt mit fgetc()
ist das zu langsam um beliebig große Dateien zu speichern?
Ich benutze auch vorher so eine Schleife:
[code="c"] anzahl = 0;while(fgetc(eingabe) != EOF) {
anzahl++;
}
[/code="c"]um herauszufinden wie große die Datei ist, ob sie noch in mein system passt. Ich könnte mir vorstellen, dass es bei großen Dateien schwierig werden könnte.
-
Ich würde mich auch über einen Tipp zur Positionierung des Zeigers in der .store-Datei freuen.
Egal welche Operation ich darauf ausführe: fseek(), rewind() der Inhalt wird immer ans Ende der Datei geschrieben. Wenn ich mir allerdings die aktuelle Position ausgeben lasse mit ftell() dann wird immer 0 ausgegeben.