1 #define _GNU_SOURCE 2 #include <unistd.h> 3 #include <signal.h> 4 #include "syscall.h" 5 #include "pthread_impl.h" 6 #ifndef __LITEOS__ 7 #include "proc_xid_impl.h" 8 #endif 9 __vfork(void)10hidden pid_t __vfork(void) 11 { 12 /* vfork syscall cannot be made from C code */ 13 #ifdef SYS_fork 14 return syscall(SYS_fork); 15 #else 16 return syscall(SYS_clone, SIGCHLD, 0); 17 #endif 18 } 19 vfork(void)20pid_t vfork(void) 21 { 22 pthread_t self = __pthread_self(); 23 pid_t parent_pid = self->pid; 24 self->pid = 0; 25 #ifdef __LITEOS__ 26 pid_t ret = __vfork(); 27 if (ret != 0) { 28 self->pid = parent_pid; 29 } else { 30 self->proc_tid = -1; 31 } 32 #else 33 int parent_by_vfork = self->by_vfork; 34 self->by_vfork = 1; 35 pid_t ret = __vfork(); 36 if (ret != 0) { 37 self->pid = parent_pid; 38 self->by_vfork = parent_by_vfork; 39 } else { 40 self->proc_tid = -1; 41 __clear_proc_pid(); 42 } 43 #endif 44 return ret; 45 } 46