linux - apue中的一个fork()程序的疑惑,请教大家
天蓬老师
天蓬老师 2017-04-17 16:37:22
0
1
412

这是8.3节的一个fork()调用程序。

 8 #include "apue.h"
  9 
 10 int globvar = 6;
 11 char buf[] = "A write to stdout!\n";
 12 
 13 
 14 int main(void)
 15 {
 16     int var;
 17     pid_t pid;
 18 
 19     var = 88;
 20     if(write(STDOUT_FILENO,buf,sizeof(buf) - 1) != sizeof(buf) - 1)
 21         err_sys("write error!");
 22     printf("before fork...\n");
 23 
 24     if(pid = fork() < 0){
 25         err_sys("fork error...");
 26     }else if(pid == 0){
 27         globvar++;
 28         var++;
 29     }else {
 30         printf("parent sleep ?");
 31         sleep(2);
 32     }
 33 
 34     printf("pid = %1d,glob = %d, var = %d\n",(long)getpid(),globvar,var);
 35     exit(0);                     
 

我的机器上输出:
A write to stdout!
before fork...
pid = 4317,glob = 7, var = 89
pid = 4318,glob = 7, var = 89 //变量值都改变了

但书上写的输出是
A write to stdout!
before fork...
pid = 4317,glob = 7, var = 89
pid = 4318,glob = 6, var = 88 // 说父进程的变量因为sleep了,变量值不会改变。

但是我的程序里面的glob值,var值,全部修改了呢?
而且,我在父进程的sleep上面加了一句 printf("parent sleep ?"); 为什么也没有在父进程返回的时候也没有打印啊?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全員に返信(1)
洪涛

行 24 では、最初に fork() < 0 を実行し、次に pid に値を割り当てます。
フォーク後、親/子プロセスの pid は両方とも 0 となり、27 ~ 28 行目を実行します。
つまり、親/子プロセスの変数が変更されます。

解決策は括弧を追加することです if((pid = fork()) < 0){

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!