process.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* ==== process.c ============================================================
  2.  * Copyright (c) 1994 by Chris Provenzano, proven@mit.edu
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *  This product includes software developed by Chris Provenzano.
  16.  * 4. The name of Chris Provenzano may not be used to endorse or promote 
  17.  *   products derived from this software without specific prior written
  18.  *   permission.
  19.  *
  20.  * THIS SOFTWARE IS PROVIDED BY CHRIS PROVENZANO ``AS IS'' AND
  21.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23.  * ARE DISCLAIMED.  IN NO EVENT SHALL CHRIS PROVENZANO BE LIABLE FOR ANY 
  24.  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  25.  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
  26.  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  27.  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  28.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  30.  * SUCH DAMAGE.
  31.  *
  32.  * Description : Process functions (fork, exec, ...).
  33.  *
  34.  *  1.23 94/04/18 proven
  35.  *      -Started coding this file.
  36.  */
  37. #include <pthread.h>
  38. #include <sys/types.h>
  39. #include <pthread.h>
  40. #include <stdarg.h>
  41. #include <unistd.h>
  42. #ifdef HAVE_ALLOC_H
  43. #include <alloc.h>
  44. #endif
  45. extern void *alloca();
  46. #ifndef lint
  47. static const char rcsid[] = "$Id$";
  48. #endif
  49. /* ==========================================================================
  50.  * fork()
  51.  *
  52.  * This function requires a sig_prevent()/sig_check_and_resume() for the
  53.  * parent. The child never unlocks.
  54.  */
  55. pid_t fork()
  56. {
  57. pid_t ret;
  58. pthread_sched_prevent();
  59. fd_kern_fork();
  60. if (ret = machdep_sys_fork()) { /* Parent or error */
  61. pthread_sched_resume();
  62. } else { /* Child */
  63. machdep_unset_thread_timer(NULL);
  64. machdep_stop_timer(NULL);
  65. fork_lock++;
  66.                 pthread_kernel_lock--;
  67. }
  68. return(ret);
  69. }
  70. #ifdef HAVE_VFORK
  71. /* The semantics of vfork probably won't mix well with the pthread
  72.    library code.  Don't even try.  */
  73. pid_t vfork ()
  74. {
  75. return fork ();
  76. }
  77. #endif
  78. /* ==========================================================================
  79.  * execve()
  80.  *
  81.  * This function requires a sig_prevent()/sig_check_and_resume() if one
  82.  * hasn't been done in the fork routine. Normally machdep_sys_execve()
  83.  * should never return.
  84.  */
  85. int execve(const char *name, char * const *argv, char * const *envp) 
  86. {
  87. int ret;
  88. if (!fork_lock) {
  89. pthread_sched_prevent();
  90. fd_kern_exec(0);
  91. ret = machdep_sys_execve(name, argv, envp);
  92. pthread_sched_resume();
  93. } else {
  94. fd_kern_exec(1);
  95. ret = machdep_sys_execve(name, argv, envp);
  96. }
  97. return(ret);
  98. }
  99. /* Variants of execve.  Define them here so that the system versions
  100.    don't get used and drag in the system version of execve.  */
  101. #include <sys/stat.h>
  102. #include <string.h>
  103. #include <sys/param.h>
  104. extern char **environ;
  105. static const char *find (const char *name, char *buf)
  106. {
  107. char *p1, *p2;
  108. extern char *getenv ();
  109. struct stat sb;
  110. if (strchr (name, '/'))
  111. return name;
  112. p1 = getenv ("PATH");
  113. if (p1 == 0)
  114. p1 = "/bin:/usr/bin:";
  115. while (*p1) {
  116. memset (buf, 0, MAXPATHLEN);
  117. p2 = strchr (p1, ':');
  118. if (p2 == 0)
  119. p2 = p1 + strlen (p1);
  120. strncpy (buf, p1, p2 - p1);
  121. buf[p2 - p1] = 0;
  122. strcat (buf, "/");
  123. strcat (buf, name);
  124. if (lstat (buf, &sb) == 0)
  125. return buf;
  126. if (*p2 == ':')
  127. p2++;
  128. p1 = p2;
  129. }
  130. return name;
  131. }
  132. int execl (const char *path, const char *arg, ...)
  133. {
  134. #ifdef SCO_3_5
  135.   return execve (path, (char *const *) &arg, environ);
  136. #else
  137.   char ** argv;
  138.   va_list ap;
  139.   int i;
  140.   va_start(ap, arg);
  141.   for (i = 1; va_arg(ap, char *) != NULL; i++);
  142.   va_end(ap);
  143.   argv = alloca (i * sizeof (char *));
  144.   va_start(ap, arg);
  145.   argv[0] = (char *) arg;
  146.   for (i = 1; (argv[i] = (char *) va_arg(ap, char *)) != NULL; i++);
  147.   va_end(ap);
  148.   return execve (path, argv, environ);
  149. #endif
  150. }
  151. int execlp (const char *name, const char *arg, ...)
  152. {
  153. #ifdef SCO_3_5
  154.   char buf[MAXPATHLEN];
  155.   return execve (find (name, buf), (char *const *) &arg, environ);
  156. #else
  157.   char buf[MAXPATHLEN];
  158.   char ** argv;
  159.   va_list ap;
  160.   int i;
  161.  
  162.   va_start(ap, arg);
  163.   for (i = 1; va_arg(ap, char *) != NULL; i++);
  164.   va_end(ap);
  165.  
  166.   argv = alloca (i * sizeof (char *));
  167.   va_start(ap, arg);
  168.   argv[0] = (char *) arg;
  169.   for (i = 1; (argv[i] = (char *) va_arg(ap, char *)) != NULL; i++);
  170.   va_end(ap);
  171.   return execve (find (name, buf), argv, environ);
  172. #endif
  173. }
  174. int execle (const char *name, const char *arg, ... /* , char *const envp[] */);
  175. /* This one turns on ptrace-style tracing?  */
  176. int exect (const char *path, char *const argv[], char *const envp[]);
  177. int execv (const char *path, char *const argv[]) {
  178. return execve (path, argv, environ);
  179. }
  180. int execvp (const char *name, char *const argv[]) {
  181. char buf[MAXPATHLEN];
  182. return execve (find (name, buf), argv, environ);
  183. }