当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

<b>cygwin下的cygheap:从父进程到子进程的复制</b>[VC/C++编程]

赞助商链接



  本文“<b>cygwin下的cygheap:从父进程到子进程的复制</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

Cygwin里的子进程在跳转到精确的位置之前要做一些特定的处理,这个处来由child_info_fork::handle_fork函数完成,在child_info_fork::handle_fork函数调用的第一个函数就是cygheap_fixup_in_child:

cygheap_fixup_in_child (false);

看它的实现:

/* Called by fork or spawn to reallocate cygwin heap */
void __stdcall
cygheap_fixup_in_child (bool execed)
{
 cygheap_max = child_proc_info->cygheap;
 cygheap = (init_cygheap *) cygheap_max;
  _csbrk ((char *) child_proc_info->cygheap_max - (char *) cygheap);
 child_copy (child_proc_info->parent, false, "cygheap", cygheap, cygheap_max, NULL);
 cygheap_init ();
 debug_fixup_after_fork_exec ();
 if (execed)
 {
  cygheap->hooks.next = NULL;
  cygheap->user_heap.base = NULL; /* We can allocate the heap anywhere */
  /* Walk the allocated memory chain looking for orphaned memory from
  previous execs */
  for (_cmalloc_entry *rvc = cygheap->chain; rvc; rvc = rvc->prev)
  {
   cygheap_entry *ce = (cygheap_entry *) rvc->data;
   if (!rvc->ptr || rvc->b >= NBUCKETS || ce->type <= HEAP_1_START)
    continue;
   else if (ce->type < HEAP_1_MAX)
    ce->type += HEAP_1_MAX; /* Mark for freeing after next exec */
   else
    _cfree (ce);  /* Marked by parent for freeing in child */
  }
 }
}

在这里child_proc_info是父进程调用CreateProcess时传送进来的参数,其cygheap和cygheap_max保存了父进程的cygheap的范围,这个函数做的第一件事就是将父进程这一段空间的内容复制到子进程相本地址的空间中,这个功效由child_copy函数完成.

紧接着,又调用了一个叫cygheap_init的函数:

extern "C" void __stdcall
cygheap_init ()
{
 cygheap_protect.init ("cygheap_protect");
 if (!cygheap)
 {
  cygheap = (init_cygheap *) memset (_cygheap_start, 0,
  _cygheap_mid - _cygheap_start);
  cygheap_max = cygheap;
  _csbrk (sizeof (*cygheap));
 }
 if (!cygheap->fdtab)
  cygheap->fdtab.init ();
 if (!cygheap->sigs)
  sigalloc ();
}

此时,由于cygheap的内容已经从父进程完好复制过来,这个函数相当于什么事没做.唯一有效果的就是cygheap_protect.init函数调用.

在cygheap_init之后,是一行空语句:

# define debug_fixup_after_fork_exec() do {} while (0)

由于从child_info_fork::handle_fork传送进来的execed为false,因此函数履行到此完毕.


  以上是“<b>cygwin下的cygheap:从父进程到子进程的复制</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .