linux - apue中的一个fork()程序的疑惑,请教大家
本文介绍了linux - apue中的一个fork()程序的疑惑,请教大家的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
这是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 ?"); 为什么也没有在父进程返回的时候也没有打印啊?
解决方案
第24行会先执行fork() < 0
再对pid赋值。
所以fork之后,父/子进程的pid都是0
并执行27-28行。
所以父/子进程的变量都改变。
解法是加括號 if((pid = fork()) < 0){
这篇关于linux - apue中的一个fork()程序的疑惑,请教大家的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文