2017-07-01 123 views
-2

我遇到fork運行在我用來爲學校項目創建終端的函數中運行的問題。Fork失敗C

這個函數被調用來處理用戶輸入時,他們在鍵入命令:

void handleExternalCommands(char ** arr) 
{ 
    pid_t pid; 

    pid = fork(); 

    printf("pid is ", (long) pid); 

    if (pid == -1) 
    { 
     perror("fork"); 
     exit(EXIT_FAILURE); 
    } 
    else if (pid == 0) 
    { 
     int status = execvp(arr[0], arr); 

     printf("im in the child process"); 

     if (status == -1) 
     { 
      // error handle 
     } 

    } 

    wait(); 
} 

但是,不管是什麼我輸入,我不能真正使if語句內。如果我嘗試通過使用以下方法來了解pid發生了什麼:

printf(pid); 

我得到了分段錯誤錯誤?

感謝您提前幫助大家。

UPDATE:

我已經改變了代碼,它上面是什麼。打印pid只發生一次,它不會打印任何內容:「pid is」

+0

如果fork失敗,您可以輕鬆確定原因。 'if(pid == -1)perror(「fork」);' –

+0

'printf(pid)'不會打印'pid',除非'pid'是一個沒有格式化字符的字符串。閱讀'printf()'的文檔。 – Peter

+0

如果'execvp()'工作,'printf()'永遠不會執行。如果(a)你在最後加了一個換行符,並且(b)'execvp()失敗了,你只會看到來自'printf()'的消息。 (OK:即使沒有換行符也可能會看到它,但換行符是一個好主意。)將'printf()'移到'execvp()'之前,並且(絕對)添加換行符,您應該看到信息。 –

回答

2

如果execvp()工作,printf()永遠不會執行。如果(a)您在最後添加了換行符,並且(b)execvp()失敗,則只會看到printf()的消息。 (OK:即使沒有換行符,最終也可能會看到它,但換行符是個好主意。)

printf()移到execvp()之前,並且(肯定)添加換行符,您應該看到信息。另請參閱printf() anomaly after fork(),但請注意,您正在運行的結果不是使用換行符終止printf()輸出。

關於printf(pid)崩潰,您需要閱讀printf() 手冊並添加編譯器選項,以便您瞭解有關錯誤使用的信息。

你可能需要:

printf("PID %d\n", pid); 

這假定pid_tint不會遇到麻煩充分兼容 - 適度安全的假設,而是一個可以通過書面形式來避免:

printf("PID %d\n", (int)pid); 

(或使用int pid;作爲定義)。但關鍵是您需要正確使用printf(),並且execvp()不會返回,除非它失敗。

+0

太棒了。謝謝你這麼簡潔的回答。我認爲我現在意識到自己的錯誤,而我的問題是針對我的計劃的實施,而不是因爲分叉失敗。感謝您的幫助。 – JPG

+1

雖然'fork()'可能會失敗,但這種情況比較少見。一般來說,假設問題出現在你自己的代碼中,而不是系統中 - 你會比錯誤更正確得多。 (即使'fork()'失敗,通常是因爲程序存在問題,而不是系統故障。) –