动机
观察父进程创建子进程后,
数据段空间
全局变量:global
栈段空间
局部变量:local
堆空间
指针变量指向:ptrInt 等
各种空间的隔离情况。
示例
示例1:交替输出
未利用sleep()做简单同步控制,混乱交替输出。
代码示例
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int global=0;
int main() {
int local=0;
int * ptrInt = NULL;
ptrInt = (int *) malloc(sizeof(int));
*ptrInt = 0;
int * ptrIntParent = NULL;
int * ptrIntChild = NULL;
pid_t child;
if ((child=fork()) == -1) {
// 创建失败
printf("Fork Error.\n");
}
if (child == 0) {
// 子进程
//sleep(1); // 请注释此行,看看执行效果差异。
printf("******************* child before modify *********************\n");
printf("Now it is in child process. I am %d.\n", getpid());
printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
printf("******************* child *********************\n");
local = local+2;
global = global + 3;
* ptrInt = * ptrInt + 4;
ptrIntChild = (int *) malloc(sizeof(int));
* ptrIntChild = 5;
printf("******************* child after modify *********************\n");
printf("Now it is in child process. I am %d.\n", getpid());
printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
printf("ptrIntChild adress is %u, *prtIntChild is %d.\n",ptrIntChild,*ptrIntChild);
printf("******************* child *********************\n");
free (ptrInt);
free (ptrIntChild);
//free (ptrIntParent);
exit(0);
}
else {
// 父进程
//sleep(1); // 请注释此行,看看执行效果差异。
printf("******************* parent before modify *******************\n");
printf("Now it is in parent process. I am %d.\n", getpid());
printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
printf("******************* parent *******************\n");
local = local + 20;
global = global + 30;
* ptrInt = * ptrInt + 40;
ptrIntParent = (int *) malloc(sizeof(int));
* ptrIntParent = 50;
printf("******************* parent after modify *******************\n");
printf("Now it is in parent process. I am %d.\n", getpid());
printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
printf("ptrIntParent adress is %u, *prtIntParent is %d.\n",ptrIntParent,*ptrIntParent);
printf("******************* parent *******************\n");
wait();
free (ptrInt);
free (ptrIntParent);
//free (ptrIntChild);
}
}
运行结果
未利用sleep()做简单同步控制,混乱交替输出。
******************* parent before modify *******************
Now it is in parent process. I am 29849.
local is 0, global is 0, prtInt is 31371280, *prtInt is 0.
******************* child before modify *********************
local adress is 3061795072, global adress is 6299760, ptrInt adress is 31371280
******************* parent *******************
******************* parent after modify *******************
Now it is in parent process. I am 29849.
local is 20, global is 30, prtInt is 31371280, *prtInt is 40.
Now it is in child process. I am 29850.
local adress is 3061795072, global adress is 6299760, ptrInt adress is 31371280
ptrIntParent adress is 31371312, *prtIntParent is 50.
******************* parent *******************
local is 0, global is 0, prtInt is 31371280, *prtInt is 0.
******************* child *********************
******************* child after modify *********************
Now it is in child process. I am 29850.
local is 2, global is 3, prtInt is 31371280, *prtInt is 4.
local adress is 3061795072, global adress is 6299760, ptrInt adress is 31371280
ptrIntChild adress is 31371312, *prtIntChild is 5.
******************* child *********************
示例2:父进程sleep,后输出
父进程利用sleep()做简单同步控制,父进程后输出。
代码示例
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int global=0;
int main() {
int local=0;
int * ptrInt = NULL;
ptrInt = (int *) malloc(sizeof(int));
*ptrInt = 0;
int * ptrIntParent = NULL;
int * ptrIntChild = NULL;
pid_t child;
if ((child=fork()) == -1) {
// 创建失败
printf("Fork Error.\n");
}
if (child == 0) {
// 子进程
//sleep(1); // 请注释此行,看看执行效果差异。
printf("******************* child before modify *********************\n");
printf("Now it is in child process. I am %d.\n", getpid());
printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
printf("******************* child *********************\n");
local = local+2;
global = global + 3;
* ptrInt = * ptrInt + 4;
ptrIntChild = (int *) malloc(sizeof(int));
* ptrIntChild = 5;
printf("******************* child after modify *********************\n");
printf("Now it is in child process. I am %d.\n", getpid());
printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
printf("ptrIntChild adress is %u, *prtIntChild is %d.\n",ptrIntChild,*ptrIntChild);
printf("******************* child *********************\n");
free (ptrInt);
free (ptrIntChild);
//free (ptrIntParent);
exit(0);
}
else {
// 父进程
sleep(1); // 请注释此行,看看执行效果差异。
printf("******************* parent before modify *******************\n");
printf("Now it is in parent process. I am %d.\n", getpid());
printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
printf("******************* parent *******************\n");
local = local + 20;
global = global + 30;
* ptrInt = * ptrInt + 40;
ptrIntParent = (int *) malloc(sizeof(int));
* ptrIntParent = 50;
printf("******************* parent after modify *******************\n");
printf("Now it is in parent process. I am %d.\n", getpid());
printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
printf("ptrIntParent adress is %u, *prtIntParent is %d.\n",ptrIntParent,*ptrIntParent);
printf("******************* parent *******************\n");
wait();
free (ptrInt);
free (ptrIntParent);
//free (ptrIntChild);
}
}
运行结果
父进程利用sleep()做简单同步控制,父进程后输出。
******************* child before modify *********************
Now it is in child process. I am 29864.
local is 0, global is 0, prtInt is 11501584, *prtInt is 0.
******************* child *********************
******************* child after modify *********************
Now it is in child process. I am 29864.
local is 2, global is 3, prtInt is 11501584, *prtInt is 4.
local adress is 2603507072, global adress is 6299768, ptrInt adress is 11501584
ptrIntChild adress is 11501616, *prtIntChild is 5.
******************* child *********************
******************* parent before modify *******************
Now it is in parent process. I am 29863.
local is 0, global is 0, prtInt is 11501584, *prtInt is 0.
local adress is 2603507072, global adress is 6299768, ptrInt adress is 11501584
******************* parent *******************
******************* parent after modify *******************
Now it is in parent process. I am 29863.
local is 20, global is 30, prtInt is 11501584, *prtInt is 40.
local adress is 2603507072, global adress is 6299768, ptrInt adress is 11501584
ptrIntParent adress is 11501616, *prtIntParent is 50.
******************* parent *******************
示例3:子进程sleep,后输出
子进程利用sleep()做简单同步控制,子进程后输出。
代码示例
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int global=0;
int main() {
int local=0;
int * ptrInt = NULL;
ptrInt = (int *) malloc(sizeof(int));
*ptrInt = 0;
int * ptrIntParent = NULL;
int * ptrIntChild = NULL;
pid_t child;
if ((child=fork()) == -1) {
// 创建失败
printf("Fork Error.\n");
}
if (child == 0) {
// 子进程
sleep(1); // 请注释此行,看看执行效果差异。
printf("******************* child before modify *********************\n");
printf("Now it is in child process. I am %d.\n", getpid());
printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
printf("******************* child *********************\n");
local = local+2;
global = global + 3;
* ptrInt = * ptrInt + 4;
ptrIntChild = (int *) malloc(sizeof(int));
* ptrIntChild = 5;
printf("******************* child after modify *********************\n");
printf("Now it is in child process. I am %d.\n", getpid());
printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
printf("ptrIntChild adress is %u, *prtIntChild is %d.\n",ptrIntChild,*ptrIntChild);
printf("******************* child *********************\n");
free (ptrInt);
free (ptrIntChild);
//free (ptrIntParent);
exit(0);
}
else {
// 父进程
sleep(1); // 请注释此行,看看执行效果差异。
printf("******************* parent before modify *******************\n");
printf("Now it is in parent process. I am %d.\n", getpid());
printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
printf("******************* parent *******************\n");
local = local + 20;
global = global + 30;
* ptrInt = * ptrInt + 40;
ptrIntParent = (int *) malloc(sizeof(int));
* ptrIntParent = 50;
printf("******************* parent after modify *******************\n");
printf("Now it is in parent process. I am %d.\n", getpid());
printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
printf("ptrIntParent adress is %u, *prtIntParent is %d.\n",ptrIntParent,*ptrIntParent);
printf("******************* parent *******************\n");
wait();
free (ptrInt);
free (ptrIntParent);
//free (ptrIntChild);
}
}
运行结果
子进程利用sleep()做简单同步控制,子进程后输出。
******************* parent before modify *******************
Now it is in parent process. I am 29856.
local is 0, global is 0, prtInt is 12333072, *prtInt is 0.
local adress is 1863379008, global adress is 6299768, ptrInt adress is 12333072
******************* parent *******************
******************* parent after modify *******************
Now it is in parent process. I am 29856.
local is 20, global is 30, prtInt is 12333072, *prtInt is 40.
local adress is 1863379008, global adress is 6299768, ptrInt adress is 12333072
ptrIntParent adress is 12333104, *prtIntParent is 50.
******************* parent *******************
******************* child before modify *********************
Now it is in child process. I am 29857.
local is 0, global is 0, prtInt is 12333072, *prtInt is 0.
******************* child *********************
******************* child after modify *********************
Now it is in child process. I am 29857.
local is 2, global is 3, prtInt is 12333072, *prtInt is 4.
local adress is 1863379008, global adress is 6299768, ptrInt adress is 12333072
ptrIntChild adress is 12333104, *prtIntChild is 5.