我從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);
}
將'vfork'視爲*棄用的* syscall(只是使用'fork')。我不確定你的代碼是否有效....另外,使用'gcc -S -fverbose-asm -O2'來獲取生成的彙編代碼(甚至可以使用'-fdump-tree-all'來生成數百個轉儲文件)... –
謝謝,我生成彙編代碼,並得到'addl $ 1,glob(%rip)調用_exit',似乎'var ++'以某種方式丟失。 –
我的理解是,你的代碼無效,GCC允許像它那樣進行優化。 –