当前位置: 技术问答>linux和unix
linux下fork与malloc的问题 跪求高手指点···
来源: 互联网 发布时间:2017-05-11
本文导语: #include #include #include int main() { char p = (char *)malloc(1024); pid_t pid = fork(); if(pid == 0) { printf("child input:%sn",p); exit(0); } else { strcpy(p,"parent runni...
#include
#include
#include
int main()
{
char p = (char *)malloc(1024);
pid_t pid = fork();
if(pid == 0)
{
printf("child input:%sn",p);
exit(0);
}
else
{
strcpy(p,"parent running!");
printf(“parent input:%sn”,p);
}
free(p);
return 0;
}
如上程序,gcc编译运行后输出:
parent input:parent running!
child inpput:
对输出的结果疑惑太多了,为什么printf没有对p初始化却没有输出乱码???
为什么child中没有输出parent running!,fork不是应该拷贝么???
还有就是为什么我把free写在大括号外面程序却没有报错???
跪求大神指教啊···
|
唉,csdn无高手?这个问题不难啊。
1. 为什么printf没有对p初始化却没有输出乱码?
进程只malloc了内存但是没有初始化,就是只分配的地址空间的一段区域但是没有实际分配
物理内存,也就没有建立页表的映射关系。这个时候对地址空间进行读操作(也就是读p中
的内容),linux会对没有映射关系地址的读操作直接返回零页,对于指针来说就是NULL,
所以结果是空的。上面有人说没有初始化可能是0也可能是任意值是不对的,linux只会返回
零页。
2. 为什么child中没有输出parent running!,fork不是应该拷贝么?
在linux下,fork出来的进程默认是跟父进程共享地址空间的,但是会标记为COW,父子
进程任意一方执行写操作后,就会自己拷贝一份内存写入,同时修改页表,对这部分内存
父子进程就不一样了。这里的例子中,父进程对p执行的写操作,所以父进程会触发COW,
父进程的p指向了新的内存,新内存中的内容是“parent running”,而子进程的p还是指向
原来的,其页表还是没有建立映射关系,所以child中输出依然是空。
1. 为什么printf没有对p初始化却没有输出乱码?
进程只malloc了内存但是没有初始化,就是只分配的地址空间的一段区域但是没有实际分配
物理内存,也就没有建立页表的映射关系。这个时候对地址空间进行读操作(也就是读p中
的内容),linux会对没有映射关系地址的读操作直接返回零页,对于指针来说就是NULL,
所以结果是空的。上面有人说没有初始化可能是0也可能是任意值是不对的,linux只会返回
零页。
2. 为什么child中没有输出parent running!,fork不是应该拷贝么?
在linux下,fork出来的进程默认是跟父进程共享地址空间的,但是会标记为COW,父子
进程任意一方执行写操作后,就会自己拷贝一份内存写入,同时修改页表,对这部分内存
父子进程就不一样了。这里的例子中,父进程对p执行的写操作,所以父进程会触发COW,
父进程的p指向了新的内存,新内存中的内容是“parent running”,而子进程的p还是指向
原来的,其页表还是没有建立映射关系,所以child中输出依然是空。
|