2013-12-21 86 views
2

我從APUE處取得了代碼。在Ubuntu 12.04,如果我用gcc不使用任何優化,我會得到的結果相同,這本書的:帶有gcc -O2的vfork()似乎有錯誤的結果。

pid = 4122, glob = 7, var = 89. 

如果我用gcc -O2,那麼VAR將是88 這是因爲gcc的優化將用vfork()做些什麼?

#include "apue.h" 

int glob = 6; 

int 
main(void) 
{ 
    int var; 
    pid_t pid; 
    var = 88; 
    printf("before vfork\n"); 
    if ((pid = vfork()) < 0) { 
    err_sys("vfork error"); 
    } else if (pid ==0) { 
    glob++; 
    var++; 
    _exit(0); 
    } 

    printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var); 
    exit(0); 
} 
+0

將'vfork'視爲*棄用的* syscall(只是使用'fork')。我不確定你的代碼是否有效....另外,使用'gcc -S -fverbose-asm -O2'來獲取生成的彙編代碼(甚至可以使用'-fdump-tree-all'來生成數百個轉儲文件)... –

+0

謝謝,我生成彙編代碼,並得到'addl $ 1,glob(%rip)調用_exit',似乎'var ++'以某種方式丟失。 –

+0

我的理解是,你的代碼無效,GCC允許像它那樣進行優化。 –

回答

3

從規範這兩條線在孩子的代碼

glob++; 
    var++; 

惹不確定behaviuor。

Linux man vfork

From POSIX.1)[...]的行爲是不確定的,如果過程 的vfork(創建)任一修改比用於存儲類型將爲pid_t 的變量之外的任何數據從vfork的返回值()[...]

這可能是值得指出的是,vfork()是「標明過時」在以前版本的POSIX(見上文POSIX鏈接),並removed from POSIX with Issue 7 (POSIX.1-2008)

建議應用程序使用fork()函數代替此函數。

vfork()函數以前是指定的。

+0

因此'gcc'可能會像它那樣優化! –

+0

絕對。 @BasileStarynkevitch – alk

+0

Thanks alk and @BasileStarynkevitch –

相關問題