当前位置:首页 > 内存 > 正文

fork无法分配内存

  • 内存
  • 2024-05-07 02:27:14
  • 4435

一、编程:用fork()创建一子进程,子进程求前10个自然数的和并打印,系统调用wait()让父进程等待子进程结束。#include
#include
#include
#includeh
#include
usingnamespacestd;
//入口函数subprocess
voidSubMain()
{
cout<<"您好,这是一个子进程"<//这里可以进行任何操作。1)
}
intmain()
{
pid_tpid=fork();
if(pid==0)
{
//子流程调用其入口函数
SubMain();
//子流程到此结束
exit(0);<
}
或if(pid>0)
{
//这是父进程
intstatus;
pid_ttmpPid=wait(&status);
if(tmpPid==pid)
{
cout<<"父进程通过等待函数知道子进程已经终止"<}
}
返回0;
}
二、linuxfork会共享哪些东西fork()不仅创建一个与父进程代码相同的子进程,而且fork执行点父进程的所有上下文场景都会自动复制到子进程中,包括:
——全局和局部变量
—打开文件句柄
—共享内存、消息和其他同步对象
由于管道调用相当于创建了两个文件句柄,因此这两个句柄也会自动复制到子进程中Fork后这两个句柄的操作效果与主进程中的操作效果一致,这样父子进程就可以很容易地通过这种机制实现数据交换,例如:
假设生成的句柄。at管道为P[0],P[1],fork后,父子进程都有P[0],P[1]句柄,所以:
——父进程可以向自己写入数据P[1]和子进程。进程可以从P[0]读取数据;记住父进程不能同时从P[0]读取数据,否则自己写入的数据可以自己读取。首先
——反之亦然,子进程向P[1]写入数据后,父进程就可以从P[0]中读取数据。这个时候
你可能不明白为什么进程中的数据读写会转移到另一个进程中去写,它们都是由操作系统的核心代码完成的。父进程调用pipe创建管道后,管道对象存储在操作系统内部。child进程结束后,子进程只是复制了相同的指针,该指针仍然指向操作系统中的同一个对象。这就是父进程和子进程可以通过它相互通信的原因。