#include <unistd.h>
int main(int argc, char* argv[]) {
while(1)
{
fork();
}
}
Ich führe dieses Programm unter Linux aus, es werden keine Ausgaben auf dem Terminal ausgegeben, das Betriebssystem scheint tot zu sein. Hat Linux eine Schutzmaßnahme für ein solches Programm, die möglicherweise nicht genügend Arbeitsspeicher hat?
Antworten:
Dies ist als Gabelbombe bekannt .
Nicht wirklich. Jeder Fork erzeugt einen neuen Prozess mit einem eigenen virtuellen Adressraum und einer eigenen Speichernutzung. Jede Kopie ist also relativ klein. Schließlich verbrauchen Sie den gesamten physischen + Swap-Speicher des Systems, und der OOM-Killer (Out-of-Memory) beendet einzelne Prozesse. Aber die Gabelbombe wird immer noch genauso schnelle Prozesse erzeugen (wenn nicht sogar schneller).
Eine Möglichkeit, dies zu verhindern, besteht darin, die Anzahl der Benutzerprozesse zu begrenzen
ulimit -u
(vorausgesetzt, Sie verwenden Bash; andere Shells haben Entsprechungen).quelle
ulimit
spezifisch für Bash ist; Andere Shells haben wahrscheinlich den gleichen integrierten Befehl, aber möglicherweise einen anderen Namen.Ja, obwohl es auf Ihrem System möglicherweise nicht standardmäßig aktiviert ist. Der
setrlimit
Systemaufruf definiert Systemgrenzen - einschließlich der Anzahl der Prozesse pro Benutzer.Schauen wir uns das zuerst in der Kernel-API an (da Sie "Linux" erwähnt haben): Sie können die Manpage für setrlimit verwenden, die Sie auffordert, so etwas zu tun
Dadurch werden die maximalen Prozesse pro Benutzer (
RLIMIT_NPROC
) auf 40 (weiches Limit) und 50 (hartes Limit) festgelegt.Wenn Sie jetzt in der Shell bash verwenden, können Sie den
ulimit
integrierten Befehl verwenden:Sie können das Limit festlegen, indem Sie es als Argument übergeben:
ulimit --help
zeigt Ihnen, dass Sie mehrere andere Grenzwerte festlegen können (einer, der von Interesse sein kann, ist die maximale Anzahl der vom Benutzer verwendeten Dateideskriptoren).quelle
Dies hängt davon ab, ob Sie es auf Benutzer- oder Systemebene verwenden möchten. Auf Benutzerebene
ulimit
wären die (oder entsprechenden Befehle für andere Shells) die einfachste Lösung.Auf Systemebene gibt es jedoch Mechanismen, die verhindern, dass böswillige Benutzer (oder einfach nicht ulimit verwenden) das System stoppen. Der Linux-cgroups-Mechanismus kann die Ressourcen pro Gruppe begrenzen. Sie können (durch
pam_systemd
Machanismus) erzwingen, dass sich die Benutzersitzung in einer bestimmten Gruppe befindet. Dies hat andere Vorteile, zum Beispiel für den CPU-Scheduler.quelle
/sys/fs/cgroup/
2. durch Suchen in Google 3. durch Durchsuchen vonmake menuconfig
4. durch Durchsuchen von/usr/src/linux/Documentation/cgroups
5. durch Lesen der systemd-Dokumentation. Entschuldigung, ich kann nicht mehr helfen, aber ich habe nur diese Ressourcen verwendet. Ich habe cgroups auf dem Desktop verwendet, um Ressourcen zu steuern.Verwenden Sie diese
ulimit -u
Option aus der Bash-Shell, um ein Limit für "maximale Benutzerprozesse" festzulegen.In der C-Shell verwenden Sie den
limit
Befehl.Wenn Sie dazu einen Systemaufruf benötigen, verwenden Sie den
setrlimit
Aufruf zum FestlegenRLIMIT_NPROC
.quelle
Da die neuesten Antworten hier über 3 Jahre alt sind, möchte ich darauf hinweisen, dass neuere Kernel (seit 4.3) explizite Unterstützung haben, um Gabelbomben über das neue "PIDs-Subsystem" zu verhindern. (Siehe https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49b786ea146f69c371df18e81ce0a2d5839f865c und https://git.kernel.org/cgit/linux/kern/ /torvalds/linux.git/commit/?id=917d8e2d10f40e28aa9e0d824b2e5b8197d79fc2 )
quelle