cygwin下的cygheap:从父进程到子进程的复制

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,因此函数执行到此结束。

时间: 2024-09-17 03:44:41

cygwin下的cygheap:从父进程到子进程的复制的相关文章

Linux文件共享(四)——父进程与子进程之间的文件共享

注:转载请注明出处   作者:lvyilong316 由fork产生的进程为子进程.fork的一个特性是父进程所有的打开文件描述符(file_struct)都被复制到子进程中,父子进程的每个相同的打开描述符共享一个文件表项如图.   在linux系统中的具体实现可用下图表示(说明:进程的fs_struct也会被复制,图中没有画出). 这种共享的方式使父.子进程对同一个文件使用了同一个文件偏移量.如果父.子进程写到同一个文件描述符,但有没有任何形式的同步,那么它们的输出就会相互混合.在fork之后

c-Linux父进程先于子进程终止后子进程的ppid不是init进程的id 1

问题描述 Linux父进程先于子进程终止后子进程的ppid不是init进程的id 1 关于父进程先于子进程终止后,子进程应该由init进程收养,所以子进程的ppid不应该是1吗?但我用C语言查看时显示的确是另一个进程id:1795 #include<unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/wait.h> int main(void) { pid_t pid; if((pid

网络安全-自编程序与搜狗输入法怎么会存在父进程与子进程的关系??

问题描述 自编程序与搜狗输入法怎么会存在父进程与子进程的关系?? 注册表位置:HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerShell?Folders[AppData] 注册表内容:C:Documents?and?SettingsAdministratorApplication?Data 进程:C:Program?FilesSogouInput7.5.0.5674SGTool.exe 父进程:F:IMFC.exe??

子进程及时知道父进程已经退出的最简单方案

  [精彩] 子进程及时知道父进程已经退出的最简单方案? http://www.chinaunix.net 作者:yuonunix  发表于:2003-10-31 10:14:14 [发表评论] [查看原文] [C/C++讨论区][关闭] 要父进程知道子进程退出,这太容易了,但是要子进程知道父进程退出,可有点麻烦.       父进程如果退出,子进程如何知道呢,最笨的方法,父子进程之间建立socket连接,然后建立心跳,没隔1秒测试一把,当然太笨了,通过管道,可以吗?如何做?有更加简单的方法吗?

Linux下检查及杀掉僵尸进程

1) 检查当前僵尸进程信息 # ps -ef | grep defunct | grep -v grep | wc - l 175 # top | head -2 top - 15:05:54 up 97 days, 23:49,  4 users,  load average: 0.66, 0.45, 0.39 Tasks: 829 total,   1 running, 479 sleeping, 174 stopped, 175 zombie # ps -ef | grep defunct

Linux下C编程:关于进程等待

#include <sys/types.h> #include <stdio.h> #include <sys/wait.h> void check_exit(int status); main() { pid_t pid; int status; if((pid = fork()) < 0) { printf("fork error!!\n"); exit(0); } else if(pid == 0) { printf("chil

VC下通过系统快照实现进程管理的方法_C 语言

本文实例讲述了VC下通过系统快照实现进程管理的方法,分享给大家供大家参考.具体实现方法如下: 一.引言 每一个应用程序实例在运行起来后都会在当前系统下产生一个进程,大多数应用程序均拥有可视界面,用户可以通过标题栏上的关闭按钮关闭程序.但是也有为数不少的在后台运行的程序是没有可视界面的,对于这类应用程序用户只能通过CTRL+ALT+DEL热键呼出"关闭程序"对话框显示出当前系统进程列表,从中可以结束指定的任务.显然,该功能在一些系统监控类软件中还是非常必需的,其处理过程大致可以分为两步:

c# 检测程序的父进程是否为 explorer.exe

问题描述 为了防止程序被破解,在限制程序不能被改名的同时,希望同时限制父进程必须是explorer.exe,同时父进程的路径必须是系统路径下的.请高手指教. 解决方案 解决方案二:父进程?不解.系统路径是什么?不解.解决方案三:helpme解决方案四:Process.StartInfo.UseShellExecute=true;后,好像就是由explorer去启动的,这个你该如何算?

编写程序,子进程通过管道向父进程发出字符串&quot;ok&quot;.

编写程序,子进程通过管道向父进程发出字符串"ok". 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 int main(void) { 5 int data_processed; //用于记录已经处理的数据 6 int file_pipes[2]; //定义两个文件描述符 7 char buffer[BUFSIZ + 1]; //定义一个缓冲区,以便从管道中读取数据