#include <stdio.h> #include <unistd.h> int main() { pid_t ret; int m = 10; if ((ret = fork()) == -1) { perror("fork"); return -1; } if (ret == 0)//child process { m++; printf("In child:pid=%d ppid=%d, m=%d, &m=%p\n", getpid(), getppid(), m, &m); return 0; } else //parent process { sleep(1); printf("In parent:childid=%d pid=%d ppid=%d, m=%d &m=%p\n", ret, getpid(), getppid(), m, &m); return 0; } return 0; } 运行结果: In child:pid=22533 ppid=22531, m=11, &m=0x7ffffc0e9cc8 In parent:childid=22533 pid=22531 ppid=32597, m=10 &m=0x7ffffc0e9cc8 子进程和父进程的m值为何不同?&m又为何相同?
解释: 在这段代码中,父进程和子进程共享相同的代码段,但是它们各自拥有独立的数据段。当进程创建子进程时,操作系统会复制父进程的数据段到子进程的地址空间中,但此后它们是完全独立的,互不影响。 现在来解释代码的运行结果: 子进程的输出结果是: In child:pid=22533 ppid=22531, m=11, &m=0x7ffffc0e9cc8 这里的 m=11 表示子进程的局部变量 m 增加到了11。这是因为子进程对自己的数据段进行了修改,所以 m 值增加了。 父进程的输出结果是: In parent:childid=22533 pid=22531 ppid=32597, m=10 &m=0x7ffffc0e9cc8 这里的 m=10 表示父进程的局部变量 m 保持为10,没有发生变化。这是因为父进程和子进程的数据段是独立的,子进程的修改不会影响父进程的数据段。 关于 &m 相同的问题,无论是父进程还是子进程,它们在代码中都有一个名为 m 的局部变量,它们各自的数据段中都会分配一块内存来存储这个变量。因此,无论在哪个进程中,&m 都指向各自进程的数据段中的相同地址。但是,由于数据段是独立的,各自的 m 变量是互不影响的。
0