51 votes

Pourquoi les C-forkbombs ne fonctionnent pas comme les bashs ?

Si je lance le classique bash forkbomb :

:(){ :&:&};:

mon système s'accroche après quelques secondes.

J'ai essayé d'écrire un forkbomb en C, voici le code :

#include <unistd.h>

int main( )
{
    while(1) {
        fork();
    }
    return 0;
}

Quand je l'exécute, le système devient moins réactif, mais je peux tuer ce processus (même après plusieurs minutes) en appuyant simplement sur ^C .


Le code ci-dessus est différent du forkbomb bash original que j'ai posté : c'est plutôt quelque chose comme :

:( )
{
    while true
    do
        :
    done
}

(Je ne l'ai pas testé, je ne sais pas si ça serait accrocher le système).

J'ai donc aussi essayé d'implémenter la version originale ; voici le code :

#include <unistd.h>

inline void colon( const char *path )
{
    pid_t pid = fork( );
    if( pid == 0 ) {
        execl( path, path, 0 );
    }
}

int main( int argc, char **argv )
{
    colon( argv[0] );
    colon( argv[0] );
    return 0;
}

Mais toujours rien : je peux l'exécuter et ensuite le tuer facilement. Ce n'est pas suspension mon système.


Pourquoi ?

Qu'est-ce qu'il y a de si spécial dans les bash forkbombs ? Est-ce parce que bash utilise beaucoup plus de mémoire/CPU ? Parce que les processus bash appellent beaucoup plus d'appels système (par exemple, pour accéder au système de fichiers) que les miens ?

44voto

Arafangion Points 5650

Ce programme C est petit , sérieusement minuscule. De plus, fork()'ing un programme comme celui-là est très, très efficace. Un interpréteur, tel que Bash, est cependant beaucoup plus coûteux en termes d'utilisation de la RAM, et doit accéder au disque en permanence.

Essayez de le faire fonctionner plus longtemps. :)

4voto

Shnatsel Points 1114

Le site réel La raison en est que dans BASH, le processus que vous créez est détaché du parent. Si le processus parent (celui que vous avez initialement lancé) est tué, le reste des processus continue à fonctionner. Mais dans les implémentations C que vous avez listées, les processus enfants meurent si le parent est tué, il suffit donc de faire tomber le processus initial que vous avez démarré pour faire tomber le processus de l'application ensemble du site arbre de processus en perpétuelle évolution.

Je n'ai pas encore trouvé d'implémentation de forkbomb en C qui détache les processus enfants afin qu'ils ne soient pas tués si le parent meurt. Des liens vers de telles implémentations seraient appréciés.

3voto

ninjalj Points 22026

Dans votre forkbomb bash, vous placez les nouveaux processus dans de nouveaux groupes de processus en arrière-plan, de sorte que vous ne pourrez pas ^C les.

0voto

bashrc Points 701

C'est essentiellement à cause de la taille. Lorsque vous exécutez la bombe bash fork, elle charge de gros programmes monstrueux en mémoire (par rapport à votre programme c), chacun d'entre eux commence à monopoliser les ressources de votre processeur, et lorsque de gros monstres commencent à se reproduire, les problèmes arrivent plus rapidement que si des abeilles commencent à faire la même chose. L'ordinateur se bloque alors immédiatement. Cependant, si vous laissez votre exécutable c tourner longtemps, il bloquera aussi le système, mais le temps sera beaucoup plus long. Si vous voulez comparer la taille de bash avec celle du programme c, consultez /proc//status. d'abord avec le pid de n'importe quelle instance de bash, puis avec le pid de n'importe quelle instance d'un programme c.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X