cloning.c
上传用户:shtangtang
上传日期:2007-01-04
资源大小:167k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /***************************************************************************
  2.                           cloning.c  -  description
  3.                              -------------------
  4.     begin                : Mon Jan 31 2000
  5.     copyright            : (C) 2000 by 豶n E. Hansen
  6.     email                : oe.hansen@gamma.telenordia.se
  7.  ***************************************************************************/
  8. /***************************************************************************
  9.  *                                                                         *
  10.  *   This program is free software; you can redistribute it and/or modify  *
  11.  *   it under the terms of the GNU General Public License as published by  *
  12.  *   the Free Software Foundation; either version 2 of the License, or     *
  13.  *   (at your option) any later version.                                   * 
  14.  *                                                                         *
  15.  ***************************************************************************/
  16. #include <stdarg.h>
  17. #include <termio.h>
  18. #include <sched.h>
  19. #include <unistd.h>
  20. #include <sys/file.h>
  21. #include <sys/stat.h>
  22. #include <sys/ioctl.h>
  23. #include <sys/types.h>
  24. #include <sys/resource.h>
  25. #include <malloc.h>
  26. #include <memory.h>
  27. #include <string.h>
  28. #include <pthread.h>
  29. #include <langinfo.h>
  30. #include <libintl.h>
  31. #include <syslog.h>
  32. #include <ctype.h>
  33. #include "cloning.h"
  34. do_clone(int (*_fn)(void *), void *_arg, void **_sp)
  35. {
  36.   char *sp;
  37.   int pid;
  38.   if (*_sp)
  39.     sp = (char *)*_sp;
  40.   else
  41.     sp = malloc(4*PAGE_SIZE);
  42.   if (sp == NULL)
  43.     return -2;
  44.   pid = __clone(_fn, sp+(4*PAGE_SIZE), CLONE_VM|CLONE_FS|CLONE_FILES, _arg);
  45.   if (pid < 0) {
  46.     if (*_sp == NULL)
  47.       free(sp);
  48.     sp = NULL;
  49.   }
  50.   *_sp = (void *)sp;
  51.   return pid;
  52. }