2017-02-02 2 views
0

J'ai donc créé une bombe "fork" par exemple. Cependant quand je l'exécute sur mon ordinateur il tue tout sur mon ordinateur, va à l'écran noir puis se restaure.Comportement C indéterministe? "Fork fork"

Sur mes amis ordinateur lors de l'exécution du même code, en fait une ela ne fork bomb mais jamais fait à la boucle de tuer.

Une raison quelconque?

#include <unistd.h> 
#include <stdio.h> 
#include <signal.h> 
#include <stdlib.h> 
int main(){ 

    int pc = 0; 
    int* pids = calloc(1025,sizeof(int)); 
    L1: 
     while(1){ 
      int pid = fork(); 
      if(pid != 0) 
      { 
       pc++; 
       pids[pc] = pid; 

      } 

      if(pc == 1024) 
      { 
       goto L2; 
       break; 
      } 
     } 
    L2: 
     while(1){ 
      if(pids[pc] != 0) { 
       kill(pids[pc],SIGKILL); 
      } 

      if(pc == 0) 
      { 
       goto L1; 
       break; 
      } 

      pc--; 
     } 
    free(pids); 
} 

Notez que ce code est juste pour les funsies.

Mise à jour:

en mettant pC++. en dehors de l'instruction if a provoqué une panique du noyau. Quelqu'un pourrait-il m'expliquer pourquoi?

En théorie, ce code ne fonctionne même pas.

+0

Est-ce que 'ulimit -u' indique les mêmes valeurs? – DaBler

+0

mon ulimit est en fait assez petit donc cela pourrait être le problème? – CabDude

+0

@DaBler savez-vous comment changer l'ulimit -u dans Mac OS Sierra? Je n'arrive pas à trouver quoi que ce soit sur la façon de le faire. – CabDude

Répondre

1

"fork bomb", par sa nature, ne peut pas avoir un comportement déterministe. En théorie, un ordinateur avec des ressources infinies peut continuer à forcer sans aucun problème. Mais en pratique, nous savons que les ordinateurs n'ont pas de ressources infinies. Ainsi, différents systèmes d'exploitation peuvent gérer la fuite des ressources de différentes manières.

Généralement, lorsque le système d'exploitation ne peut générer d'autres processus, le noyau peut tuer le (ou les) processus «offensant» afin de libérer des ressources ou de se bloquer ou de se retrouver dans un état de limbo. La croissance exponentielle des processus est généralement difficile à gérer pour le noyau même s'il le reconnaît.

Donc, vous ne pouvez pas attendre quoi que ce soit un comportement déterministe ou reproductible.

+0

Mon ami et moi avons tout le même modèle d'ordinateur. Il charge les processus (en gardant une trace avec le haut).Cependant le mien va juste et tue tout ce que je suppose. Je ne comprends tout simplement pas pourquoi le mien va et tue et le sien ne l'est pas et c'est parce que les ordinateurs sont différents, donc d'une certaine manière, la même chose est traitée différemment? – CabDude

+2

Même le * même * système d'exploitation peut se comporter différemment lors de la prochaine tentative. Il n'y a pas de comportement "attendu" quand un système d'exploitation est sur le crash. – usr

2

La raison pour laquelle vous plantez probablement est qu'il est possible que fork() échoue, auquel cas il retournera -1. Lorsque vous appelez kill(-1, SIGKILL), il envoie SIGKILL à tous les processus sur votre système. Si vous courez en tant qu'utilisateur privilégié, la raison pour laquelle c'est terrible devrait être évidente.

notes secondaires:

  1. Le type de retour de fork() est pid_t, pasint. Dans la plupart des cas, pid_t se trouve dans un int, mais vous devez utiliser les types appropriés. Il est inutile d'avoir une instruction break après une instruction goto. Le break ne peut jamais être atteint.

  2. Si vous avez activé les avertissements sur votre compilateur, il serait probablement vous avez parlé de deux personnes.