(void)execve(path, argv, envp);
if (envp) { (void)execve(path, argv, envp); } else {  (void)execv(path, argv); }
ForkAndExec(    const char *path,    char *const *argv,    char *const *envp,    const PRProcessAttr *attr){    PRProcess *process;	    process = PR_NEW(PRProcess);    if (!process) {        PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);        return NULL;    }    process->md.pid = fork();    if ((pid_t) -1 == process->md.pid) {        PR_SetError(PR_INSUFFICIENT_RESOURCES_ERROR, errno);        PR_DELETE(process);        return NULL;    } else if (0 == process->md.pid) {  /* the child process */        /*         * If the child process needs to exit, it must call _exit().         * Do not call exit(), because exit() will flush and close         * the standard I/O file descriptors, and hence corrupt         * the parent process's standard I/O data structures.         */        if (attr) {            if (attr->stdinFd                    && attr->stdinFd->secret->md.osfd != 0) {                if (dup2(attr->stdinFd->secret->md.osfd, 0) != 0) {                    _exit(1);  /* failed */                }                close(attr->stdinFd->secret->md.osfd);            }            if (attr->stdoutFd                    && attr->stdoutFd->secret->md.osfd != 1) {                if (dup2(attr->stdoutFd->secret->md.osfd, 1) != 1) {                    _exit(1);  /* failed */                }                close(attr->stdoutFd->secret->md.osfd);            }            if (attr->stderrFd                    && attr->stderrFd->secret->md.osfd != 2) {                if (dup2(attr->stderrFd->secret->md.osfd, 2) != 2) {                    _exit(1);  /* failed */                }                close(attr->stderrFd->secret->md.osfd);            }            if (attr->currentDirectory) {                if (chdir(attr->currentDirectory) < 0) {                    _exit(1);  /* failed */                }            }        }        (void)execve(path, argv, envp);        /* Whoops! It returned. That's a bad sign. */        _exit(1);    }#if defined(_PR_NATIVE_THREADS)    PR_Lock(pr_wp.ml);    if (0 == pr_wp.numProcs++) {        PR_NotifyCondVar(pr_wp.cv);    }    PR_Unlock(pr_wp.ml);#endif    return process;}