59 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
| /* libc/sys/linux/process.c - Process-related system calls */
 | |
| 
 | |
| /* Written 2000 by Werner Almesberger */
 | |
| 
 | |
| 
 | |
| #include <sys/unistd.h>
 | |
| #include <sys/wait.h>
 | |
| #include <machine/syscall.h>
 | |
| 
 | |
| 
 | |
| #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
 |