2013-01-31 165 views
4

我的教授給出了C下面的例子:兩個條件如何在if-ifelse-else語句中起作用?

#include <sys/types.h> 
#include <stdio.h> 
#include <unistd.h> 

int main() { 
    pid_t pid; 

    /* fork another process */ 
    pid = fork(); 
    if (pid < 0) { /* error occurred */ 
     fprintf(stderr, "Fork Failed"); 
     return 1; 
    } 
    else if (pid == 0) { /* child process */ 
     execlp("/bin/ls", "ls", NULL); 
    } 
    else { /* parent process */ 
     /* parent will wait for the child */ 
     wait (NULL); 
     printf("Child Completed its execution\n"); 
    } 

return 0; 
} 

我編譯它,並運行它。我在這段代碼中看到了一個奇怪的行爲:

'ls'程序/命令的結果打印在else if條件中,而且還打印出其他字符串「Child Completed its execution \ n」。

這不是一種奇怪的行爲嗎?

+0

當您看到一個您不知道的函數時,請務必查看相關手冊!那裏沒有黑暗魔法。稍微看一下那裏應該啓發你http://linux.die.net/man/2/fork :) – Rerito

回答

5

不,你分叉它。有兩個進程正在運行。一個報告了ls,另一個報告了printf()。

具體來說,子/分叉進程執行/ bin/ls和父進程printf(),你看到的輸出。

+0

你的意思是孩子檢查其他條件,如果它在孩子身邊是真的。家長也檢查相同的條件,但它是錯誤的,然後它落入'其他'?所以我有兩個使用if語句和指令的進程? – malhobayyeb

+0

是的,每個進程(父進程)和fork都執行相同的代碼。子進程(在調用fork()時創建的進程)將具有零的pid,因此該條件將成立。父母將有一個XXXX(> 0)的PID,並因此滿足最後一個條件。 –

+1

我在返回0之前放置了一個printf語句,但它被執行了一次。什麼時候叉子在我的代碼中終止? execlp是否終止了孩子? – malhobayyeb

2

這是因爲fork創建它繼續從代碼相同的點執行的子進程,但pid設置爲0是你所看到的是執行printf行父進程,而子進程正在執行的ls命令。

相關問題