linux fork()函数

#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