2017-02-02 5 views
0

私は「フォーク」爆弾を作成しました。しかし、私はそれを私のコンピュータ上で実行すると、それは私のコンピュータ上のすべてを殺し、黒い画面に移動して復元します。私の友人のコンピュータで非確定的なCの振る舞い? "フォーク爆弾"

まったく同じコードを実行している、彼は実際にフォーク爆弾を行いますが、決してキルループにそれを行うものではありません。

何らかの理由がありますか?

#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); 
} 

このコードは単なるファンキーのためのものです。

更新:

パットPC++。 if文の外側でカーネルパニックが発生しました。誰かがなぜ私に説明することができますか?

理論的には、このコードは機能しません。

+0

'ulimit -u'は同じ値を報告しますか? – DaBler

+0

私のulimitは実際にはかなり小さいので、これは問題かもしれませんか? – CabDude

+0

@DaBler Mac OS Sierraでulimit -uを変更する方法を知っていますか?私はこれを行う方法についてどこにも見当たりません。 – CabDude

答えて

1

"fork bomb"は、その性質上、いかなる決定論的振る舞いを持つことができません。理論的には、無限のリソースを持つコンピュータは問題なくフォークすることができます。 しかし、実際には、コンピュータに無限のリソースがないことがわかっています。そのため、異なるオペレーティングシステムでは、リソースの排水をさまざまな方法で処理できます。オペレーティングシステムは、さらにプロセスを起動できない場合

通常、カーネルがリソースを解放たりクラッシュしたり、中ぶらりんの状態に入るために「違反」プロセス(複数可)を殺すかもしれません。プロセスの指数関数的増加は、カーネルがそれを認識してもカーネルでは扱いにくいのが一般的です。

だから、あなたは何でも決定論的または反復可能な動作を期待することはできません。

+0

私の友人と私はすべて同じコンピュータモデルを持っています。彼はプロセスをロードしています(トップを記録しています)。しかし、私のことは、私が推測しているすべてのものを殺してしまいます。なぜ私のコンピュータが異なっているので、私はどうして私が行って殺したのか理解できないのでしょうか?何らかの形で、同じことが違う扱いになっていますか? – CabDude

+2

次回試してみると、*同じ* OSでさえ違うように振る舞い/処理することができます。 OSがクラッシュした場合、「期待される」動作はありません。 – usr

2

あなたはおそらくクラッシュしている理由は、それが返された場合には、fork()が失敗することが可能であるということです-1。 kill(-1, SIGKILL)に電話すると、システム上のすべてのプロセスにSIGKILLに送信されます。特権ユーザーとして実行している場合、これはひどい理由は明らかです。

サイドノート:

  1. fork()の戻り値の型がpid_tないintです。ほとんどの場合、pid_tintに収まりますが、適切なタイプを使用する必要があります。

  2. ステートメントがgotoステートメントの後にあることは意味がありません。 breakにアクセスすることはできません。あなたは、コンパイラの警告を有効にした場合

  3. は、それはおそらく、これらの両方について、あなたに言っただろう。

関連する問題