#include <unistd.h>
int main(int argc, char* argv[]) {
while(1)
{
fork();
}
}
J'exécute ce programme sur mon linux, rien ne sort sur le terminal, l'OS semble disparaître. Linux a-t-il une mesure de protection contre un tel programme qui peut manquer de mémoire?
Réponses:
Ceci est connu comme une bombe à fourche .
Pas vraiment. Chaque fork produit un nouveau processus, avec son propre espace d'adressage virtuel et sa propre utilisation de la mémoire. Donc, chaque copie est relativement petite. Finalement, vous utiliserez toute la mémoire physique + swap du système, et le tueur hors mémoire (OOM) commencera à tuer les processus individuels. Mais la bombe fourchette créera toujours des processus tout aussi rapides (sinon plus rapides).
Une façon d'éviter que cela ne se produise en premier lieu consiste à limiter le nombre de processus utilisateur à l'aide de
ulimit -u
(en supposant que vous utilisez Bash; les autres shells auront des équivalents).la source
ulimit
est spécifique à bash; d'autres obus auront probablement la même commande intégrée, mais peut-être avec un nom différent.Oui, bien qu'il ne soit pas activé par défaut sur votre système. L'
setrlimit
appel système définit les limites du système, y compris le nombre de processus par utilisateur.Examinons-le d'abord dans l'API du noyau (puisque vous avez mentionné "linux"): vous pouvez utiliser la page de manuel de setrlimit, qui vous dira de faire quelque chose comme
Cela définira le nombre maximal de processus par utilisateur (
RLIMIT_NPROC
) à 40 (limite souple) et 50 (limite stricte).Maintenant, à partir du shell, si vous utilisez bash, vous pouvez utiliser la
ulimit
commande intégrée:Vous pouvez définir la limite en la passant comme argument:
ulimit --help
vous montrera qu'il existe plusieurs autres limites que vous pouvez définir (une qui peut être intéressante est le nombre maximum de descripteurs de fichiers utilisés par l'utilisateur).la source
Cela dépend si vous souhaitez l'utiliser au niveau utilisateur ou au niveau système. Au niveau utilisateur, la
ulimit
(ou les commandes correspondantes pour d'autres shells) serait la solution la plus simple.Cependant, au niveau du système, il existe des mécanismes pour empêcher les utilisateurs malveillants (ou tout simplement ne pas utiliser ulimit) d'arrêter le système. Le mécanisme des cgroups Linux peut limiter les ressources par groupe. Vous pouvez forcer (par
pam_systemd
machanisme) la session utilisateur à être dans un groupe spécifique. Cela présente d'autres avantages, par exemple pour le planificateur de CPU.la source
/sys/fs/cgroup/
2. en recherchant dans google 3. en parcourantmake menuconfig
4. En consultant/usr/src/linux/Documentation/cgroups
5. En lisant la documentation de systemd. Désolé, je ne peux pas vous aider davantage, mais j'ai utilisé uniquement ces ressources. J'ai utilisé des groupes de contrôle sur le bureau pour contrôler les ressources.Utilisez à
ulimit -u
partir du shell bash pour définir une limite sur les "processus utilisateur max".Depuis le shell C, vous utilisez la
limit
commande.Si vous avez besoin d'un appel système pour ce faire, utilisez l'
setrlimit
appel pour définirRLIMIT_NPROC
.la source
Étant donné que les réponses les plus récentes ici datent de plus de 3 ans, je tiens à souligner que les noyaux plus récents (depuis la version 4.3) ont un support explicite pour empêcher les bombes à fourche via le nouveau "sous-système PID". (Voir https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49b786ea146f69c371df18e81ce0a2d5839f865c et https://git.kernel.org/cgit/linux/kernel/git /torvalds/linux.git/commit/?id=917d8e2d10f40e28aa9e0d824b2e5b8197d79fc2 )
la source