2015-09-20 24 views
-1

我正在學習C並遇到一個小問題。閱讀關於維基百科和StackOverflow上的fork()炸彈。我想實現相同的,但使用命令行參數。Fork-Exec沒有圈的炸彈

我想無休止地調用firefox/chrome,但無法在我的下面的程序中做同樣的事情。任何援助將不勝感激。

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <string.h> 
#include <errno.h> 

int main(int argc, char **argv) 
{ 
    pid_t pid; 
    char *parmList[] = {"firefox", "index.html", NULL}; 
    int a; 

    if ((pid = fork()) == -1) 
    { 
     perror("fork failed"); 
    } 
    if (pid == 0) 
    { 
     a = execvp("/usr/bin/firefox", parmList); 
     fprintf(stdout, "execvp() returned %d\n", a); 
     fprintf(stdout, "errno: %s (%d).\n", strerror(errno), errno); 
    } 
    else 
    { 
     waitpid(pid, 0, 0); 
    } 

    return 0; 
} 
+0

那麼,你分叉一次。也許嘗試做更多? – Ryan

+0

它沒有執行,我嘗試使用while循環並給出參數,例如'myProgram firefox' – user3337714

+1

'execvp()'如果成功則永不返回;而是用當前執行的二進制代替當前進程。因此,只有在執行Firefox **失敗的情況下才會執行'fprintf(stdout,...);'行。在正常成功的情況下,您看不到任何輸出。如果它啓動了Firefox的第一個副本,則父級只會「掛起」,直到最後一個Firefox窗口關閉;如果Firefox已經打開,程序會立即返回。只是因爲你沒有看到你的期望,並不意味着*「它沒有執行」*。 –

回答

0

你應該澄清你得到了什麼錯誤,因爲我不希望運行一個叉炸彈,但你寫的代碼不彈(稱之爲環內fork())。它產生了一個過程,很好地等待,然後退出。

+0

當我使用命令行參數時,甚至沒有打開firefox/chrome – user3337714

+0

如果'fork()'和'execvp()'都沒有報告錯誤,而且這隻發生在給出參數時,Firefox正在運行並立即退出。 'index.html'確實存在於當前工作目錄中嗎? – Davislor

+0

'execvp()返回-1'' 'errno:沒有這樣的文件或目錄(2).'我刪除了'index.html',仍然是錯誤。 – user3337714