2015-06-03 44 views
0

考慮以下程序的輸出:混淆叉的輸出要求

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
void main() 
{ 
    pid_t pid; 
    int a = 5; 
    pid = fork(); 
    if (pid == 0) 
     printf("This is the son process, a = %d\n", --a); 
    else 
     printf("This is the dad process, a = %d\n", ++a); 
} 

,我期望的輸出是:

This is the son process, a = 4; 
This is the dad process, a = 6; 

但我得到的輸出:

This is the son process, a = 4 

那麼爲什麼父進程沒有執行printf?我怎樣才能得到我想要的輸出?

更新:

剛纔我試了一次,這樣的輸出:

$ gcc fork.c -o fork 
$ ./fork 
This is the dad process, a = 6 
$ This is the son process, a = 4 

現在還有一個問題:爲什麼會出現輸出的線$兩者之間?

我認爲預期的輸出應該是這樣的:

$ gcc fork.c -o fork 
$ ./fork 
This is the dad process, a = 6 
This is the son process, a = 4 

我想不通爲什麼$是存在的。

更多細節:

gcc version: gcc 4.8.2 
OS: ubuntu 14.04 
+0

複製粘貼你的代碼,我得到你期望的輸出。我建議你指定你正在編譯/運行哪個操作系統。 – m0skit0

+0

我無法重現這一點。但是你需要'#include '(而不是pthread.h,這裏不需要pthread.h)。如果它仍然不起作用,您應該發佈更多信息,例如編譯和運行程序的方式以及您正在使用的平臺。 – nos

+0

從兒子printf工作,但它是從父親的printf沒有工作......你肯定需要指定你的環境 – theadnangondal

回答

0

$只是在過程輸出之間顯示的提示。由於孩子與父母「分離」,父母可能會在孩子完成之前返回到外殼。所以提示被打印,然後是孩子的輸出。如果您將所有輸出重定向到一個文件,$將不會在那裏。

4

您需要檢查 「叉失敗」 狀態。當fork()返回-1時,發生錯誤。這是函數語義的一部分,所以如果你忽略它,你將得到不正確的結果。

查看考慮到分叉失敗的可能性的示例here

查看關於爲什麼fork可能會在此related question失敗的討論。

+0

叉子確實創建了一個孩子。否則== 0檢查將失敗。它僅在child中的子元素和pid中返回0,否則在父元素中返回-1並且未創建子元素..............因此,創建子元素意味着分叉已通過 – theadnangondal

+0

@theadnangondal他應該在任何其他事情之前檢查-1。這是它完成的方式。如果他忽略了這張支票,他怎麼能確定其他所有東西都是正確的?爲什麼首先省略這個檢查?它必須在那裏。 –

+0

毫無疑問,你是對的。但這裏發生了一些事情,父母。子進程確實是工作 – theadnangondal