Autor Thema: Design für mein OS  (Gelesen 14929 mal)

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 27. July 2011, 23:36 »
Der Vaterprozess kann zum Beispiel eine Datei öffnen und an einen niedriger privilegierten Kindprozess vererben, der sie selbst nicht mehr öffnen könnte. Sowas kommt schon mal vor.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 28. July 2011, 11:18 »
Hallo,


Der Vaterprozess kann zum Beispiel eine Datei öffnen und an einen niedriger privilegierten Kindprozess vererben, der sie selbst nicht mehr öffnen könnte. Sowas kommt schon mal vor.
Solange der Vaterprozess die Datei unmittelbar nach oder während dem Vererben schließt liegt da auch kein Sharing vor so das ein lokaler Datei-Pointer in der libc kein Problem darstellt. Und genau darum geht es mir doch, ich würde gerne den VFS-Service aus solchen Dingen weitestgehend raus halten und für echte Dateien nur pread/pwrite anbieten wollen (beides aus Gründen der Performance). Klar bedeutet dass das in der libc eine zusätzliche Schicht rein muss aber die dürfte eigentlich nur aus einer vTable bestehen (dafür ist diese Schicht nicht mehr im VFS oder sonstwo erforderlich).


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 28. July 2011, 13:20 »
Ich dachte, du willst Vererben grundsätzlich und ohne Ausnahme verbieten? Wie sollte es dann helfen, nach dem Vererben die Datei zu schließen? Die Vererbung ist doch dann schon schiefgegangen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 28. July 2011, 15:46 »
Hallo,


Wo hab ich geschrieben das ich Vererbung "grundsätzlich und ohne Ausnahme" verbieten will?
Ich nehme an Du meinst nur Dateien?
Dateien sollen bei mir nicht geshared werden aber gegen Vererben im Sinne von Weitergeben hab ich nichts einzuwenden, die Frage ist eher wie das zu implementieren ist. Ich könnte mir vorstellen dafür ein Flag "FD_CLOFORK" (was sich auf den Elternprozess bezieht) in der libc einzuführen (zumindest in der BAD-POSIX-Version), wenn der Versuch eine Datei ohne dieses Flag zu vererben zu einem Fehler führt kann man den Source-Code des Programms analysieren und einfach fixen. Da viele Programme kein allumfassendes Fehlerhandling haben wäre es hier geschickt wenn die libc interne Fehler mit einem gesondertem Mechanismus loggen kann.

Ich will doch gar keine echte POSIX-Konformität erreichen (ist für mein eigenes Projekt eh unrealistisch), alles was ich will ist das man möglichst viele existierende Programme mit möglichst wenig Aufwand portieren kann (und das am besten ohne das man sich merkwürdige Effekte einhandelt).

Aus Gründen der Performance finde ich es besser wenn z.B. der Datei-Pointer nicht im VFS sondern in der libc ist (deswegen hab ich das Thema ja eigentlich erst hier angesprochen). Damit bekommt man aber eben Probleme beim POSIX-Konformen Vererben von Dateien. Mein Vorschlag ist nichts weiter als eine Variante damit umzugehen und trotzdem möglichst viele existierende Programme möglichst ohne Änderungen lauffähig zu halten. Der Grund warum ich glaube dass das auch funktioniert ist der das es kaum echte Szenarien gibt in denen echte Dateien vererbt werden (die paar Ausnahmen die es sicher gibt werden die Datei auch nicht sharen sondern eher nur weitergeben was natürlich auch mit möglichst wenig Portierungsaufwand machbar sein soll) so das es IMHO reicht wenn man richtiges Vererben nur mit Streams kann.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #24 am: 28. July 2011, 16:42 »
Moin,

ich werd' jetzt einfach pread, pwrite, read write und seek in mein VFS packen. Damit sind alle Fälle einfach abgedeckt.

Nochmal Danke für eure Hilfe :)

Grüße,
LittleFox

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 28. July 2011, 17:24 »
Das ist übertrieben. ;-)
Denn read und write kannst du immer mit pread und pwrite emulieren, das sind dann Dreizeiler in der libc. Die brauchen nicht ins VFS.

Gruß,
Svenska

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 28. July 2011, 18:17 »
Hallo,


Denn read und write kannst du immer mit pread und pwrite emulieren ....
Aber nur wenn auch der Datei-Pointer in der libc bleibt und das ist ja wieder nicht POSIX-Konform. Dieser Dreizeiler wird für ein POSIX-Konformes System wohl ins VFS müssen. Wenn das VFS nur pread/pwrite kennt dann benötigt es auch kein seek,


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 29. July 2011, 03:24 »
Gut, dann kann man eben read, write und seek implementieren und pread/pwrite in der libc verschwinden lassen.

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 29. July 2011, 09:05 »
Hallo,


und pread/pwrite in der libc verschwinden lassen.
Und wie? Doch wohl hoffentlich nicht indem Du seek und dann read/write und dann wieder seek machst? Stell Dir nur mal vor was die anderen POSIX-Konformen Programme dazu sagen wenn Du einfach mal so den Datei-Pointer kurz änderst. ;) Von den 2 unnützen Syscalls/IPC-Calls mal ganz abgesehen, eigentlich sind es ja 3 zusätzliche Syscalls/IPC-Calls weil Du ja vorher noch den alten Datei-Pointer erfragen musst.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

 

Einloggen