Linux-Quellcodes und fork-Baum

Post Reply
Message
Author
Der_Wanderer
Posts: 3
Joined: 02. Dec 2006 16:40

Linux-Quellcodes und fork-Baum

#1 Post by Der_Wanderer »

Also ich bin neu hier und ich wende mich an dieses Forum, weil ich bin echt überfordert. :cry: Mein Problem richtet sich an die, die wirklich Ahnung von der Programmierung und vom inneren Aufbau von Linux haben.

Mir wurde die Aufgabe gestellt den fork-Baum pro Nutzer in der Ebene zu beschränken. Also forken geht soviel man will, so lange die Prozesse nicht mit einander verwandt sind. (Fragt nicht dem Sinn dieser Modifikation, der ist mir selbst noch nicht so bewusst)

Nach langem googeln und stöbern in den Linux-Quellcodes bin ich in der Struktur struct_task in der sched.h auf einen Zeiger p_cptr gestoßen der, wenn ich das richtig verstanden habe, auf die verschiedenen Kinds-Ebenen Zeigt. Ich dachte mir, da kann ich vielleicht ein Zähler mitlaufen lassen und so die Ebenen zählen und dann abbrechen, wenn eine Grenze überschritten wurde.

Es gibt aber auch eine fork.c, vielleicht kann man auch dort eingreifen. Aber um ehrlich zu sein fällt es mir schwer in der fork.c durch zu steigen.

Meine Frage ist, ob ich so auf einem völlig falschen Dampfer bin, oder ob die Richtung stimmt. Hat jemand Erfahrung damit, kann mir jemand helfen, oder kann mir jemand Tipps geben? Ich weiß, das ganze ist ziemlich speziell.

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

Lustige Idee, das. Leider wird mit dieser Vorgabe keine normale Software auf dem System mehr funktionieren. Starte mal ein paar Programme, und mach dann mal "pstree". Da siehst du dann etliche wichtige Programme, die erst in der dritten oder vierten Ebene von init abhängen.

Falls du es trotzdem machen willst: Du musst fork() dahingehend modifizieren, dass geprüft wird, ob die PID == 1 ist. Dann darf nur "init" neue Prozesse starten, und du hast nur eine Ebene unterhalb von init.

Um Forkbomben zu verhindern ist es sinnvoller, ein passendes ulimit zu setzen. Dafür braucht man gar nichts zu ändern.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Der_Wanderer
Posts: 3
Joined: 02. Dec 2006 16:40

#3 Post by Der_Wanderer »

Man müsste es bis auf 4 oder 5 Ebenen beschränken. Wenn init nur eine Ebene erzeugen darf, dann weiß ich nicht ob Linux überhaupt noch richtig bootet :)
Es muß auch keine Software mehr laufen, hautpsache es ist noch eine Kommandozeile zu sehen.

Es ist halt eine Übungsaufgabe und deshalb müssen die Ebenen beschränkt werden, weil einfach nur die Anzahl der fork zu beschränken dürfte um eineiges leichter sein. Ich glaube nicht wirklich daß das mit den Ebenen einen praktischen nutzen hat :)

Könnte man die Modifikation vielleicht auch in der init-Funktion vornehmen?

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#4 Post by Janka »

Zum Üben, OK. Dann bitte aber auch selbst machen. Ich würde es folgendermaßen machen:

Bei jedem fork() die PPID des forkenden Prozesses abfragen. Dann die PPID dieses Prozesses abfragen usw., die Anzahl der Durchläufe mitzählen, bis die PPID==1 ist. Danach fork() erlauben bzw. verbieten.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Der_Wanderer
Posts: 3
Joined: 02. Dec 2006 16:40

#5 Post by Der_Wanderer »

Klar mach ich es selbst, mir fehlt halt bis jetzt nur ein vernünftiger Ansatz, da ich im Linux-Code ein bissl verloren bin.

Aber dein Vorschlag hört sich viel versprechend an, mal sehen ob ich das so hin kriege.

Danke für deine Hilfe

Post Reply