2014-03-07 33 views
0

我試圖理解下面的代碼做什麼:的代碼說明 - 叉,等待,execv

#include <stdio.h> 
#include <stdlib.h> 
#include <syscall.h> 
#include <unistd.h> 

int main(void) { 
    int pid; 

    for(;;) { 
     pid = fork(); 
     printf(getpid()); 

     if(pid == -1) { 
      printf("fork failed"); 
      exit(1); 
     } 

     if(pid == 0) { 
      execv("MYFORKAPP", NULL); 
      exit(2); 
     } 

     wait(); 
    } 
return 0; 
} 

程序本身被稱爲MYFORKAPP。我正在學習這3個函數,並且在互聯網上看到了這些代碼,我不明白它的作用。

我試圖運行它(Fedora GCC),但終端是空的。

是否應至少打印第一個getpid()

你能解釋我這個代碼嗎?

+1

它看起來像[fork bomb](http://en.wikipedia.org/wiki/Fork_bomb)。 –

+0

@leeduhem,父進程等待(阻塞調用)子進程。換句話說,父母程序不會有一個以上的子程序。 – someuser

+0

@someuser這個子進程會再次執行相同的程序,它會fork()然後wait(),它的子進程會再次執行相同的操作,依此類推。不是正常的叉式炸彈,是的,但它仍然會創造很多過程,直到它不能。 –

回答

2
printf(getpid()); 

這可能會崩潰該程序。 printf()預計其第一個參數是一個字符串,但getpid()將返回一個整數,所以此整數將用作指向字符數組的指針,這很可能導致崩潰,即分段錯誤。

除此之外,這是什麼程序做是

  1. fork()一個子進程和wait()
  2. 這個孩子進程將execuate再次同一程序
  3. 所以它會fork()wait()
  4. 等直到你的系統沒有足夠的資源來創建新的進程
  5. 然後fork()將失敗,這些不同級別的子進程將逐個退出
  6. 最後,由shell創建的第一個進程將退出,程序結束。
0

以下代碼做了什麼 - 分段錯誤。
必須是:

#include <stdio.h> 
#include <stdlib.h> 
#include <syscall.h> 
#include <unistd.h> 

int main(void) { 
    int pid; 

    for(;;) { 
     pid = fork(); 

     if(pid == -1) { 
      printf("fork failed"); 
      exit(1); 
     } 

     if(pid == 0) { 
      printf("child has pid %d\n", getpid()); 
      execv("MYFORKAPP", NULL); 
      exit(2); 
     } 

     wait(); 
    } 
return 0; 
} 

這是一個循環:
1.家長創建一個子進程。
2. MYFORKAPP的小孩頭像。
3.父級等待子進程。
4.孩子終止(可能)。
5.轉到1