/* libc/sys/linux/process.c - Process-related system calls */ /* Written 2000 by Werner Almesberger */ #include #include #include #define __NR__exit __NR_exit #define __NR__execve __NR_execve _syscall0(int,getpid) _syscall0(pid_t,getppid) weak_alias(__libc_getpid,__getpid); #if !defined(_ELIX_LEVEL) || _ELIX_LEVEL >= 3 _syscall3(int,_execve,const char *,file,char * const *,argv,char * const *,envp) _syscall0(int,fork) #endif /* _ELIX_LEVEL >= 3 */ #if !defined(_ELIX_LEVEL) || _ELIX_LEVEL >= 4 _syscall0(pid_t,getpgrp) _syscall2(int,setpgid,pid_t,pid,pid_t,pgid) _syscall0(pid_t,setsid) /* Here we implement vfork in terms of fork, since * Linux's vfork system call is not reliable. */ pid_t vfork(void) { pid_t pid; pid = fork(); if(!pid) { /* In child. */ return 0; } else { /* In parent. Wait for child to finish. */ if (waitpid (pid, NULL, 0) < 0) return pid; } } #endif /* !_ELIX_LEVEL || _ELIX_LEVEL >= 4 */ /* Although _exit is listed as level 3, we use it from level 1 interfaces */ /* FIXME: get rid of noreturn warning */ #define return for (;;) _syscall1(void,_exit,int,exitcode) #undef return