text: Linux-Quellcodes und fork-Baum - Pro-Linux
  Linux-Quellcodes und fork-Baum
  Registriert: 02. Dez 2006 16:40
  #1 Beitrag von Der_Wanderer » 02. Dez 2006 16:59
  Also ich bin neu hier und ich wende mich an dieses Forum, weil ich bin echt überfordert. 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.
  #2 Beitrag von Janka » 02. Dez 2006 19:31
  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.
  #3 Beitrag von Der_Wanderer » 03. Dez 2006 11:30
  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?
  #4 Beitrag von Janka » 03. Dez 2006 14:16
  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.
  #5 Beitrag von Der_Wanderer » 03. Dez 2006 14:38
  Klar mach ich es selbst, mir fehlt halt bis jetzt nur ein vernünftiger Ansatz, da ich im Linux-Code ein bissl verloren bin.