如果我们把输出重定向到文件,因为printf带缓冲区因此当子进程复制父进程的数据空间时,将该缓冲区也复制过来。因此有两个before fork。
一 源代码:
1 #include "apue.h"
2
3 int grobval = 7;
4 char buf[] = "write to stdout\n";
5
6 int main()
7 {
8 int val = 90;
9 pid_t pid;
10
11 if( write(STDOUT_FILENO, buf, sizeof(buf) - 1) != sizeof(buf) - 1)
12 err_sys("write error");
13 printf("before forki\n");
14
15 if ((pid = fork()) < 0){
16 err_sys("fork error");
17 }
18 else if (pid == 0){
19 grobval++;
20 val++;
21 }
22 else{
23 sleep(2);
24 }
25
26 printf("pid = %d, grobval = %d, val = %d\n",getpid(),grobval,val);
27 exit(0);
28
29 }
二 运行结果:
./fork_value
write to stdout
before forki
pid = 15271, grobval = 8, val = 91
pid = 15270, grobval = 7, val = 90
如果我们把输出重定向到文件,因为printf带缓冲区因此当子进程复制父进程的数据空间时,将该缓冲区也复制过来。因此有两个before fork。
./fork_value > out.txt
cat out.txt
write to stdout
before forki
pid = 16958, grobval = 8, val = 91
before forki
pid = 16957, grobval = 7, val = 90