typedef int __pid_t;			 
extern __pid_t fork  (void)    ;
extern int printf  (__const char *__restrict __format, ...)    ;
extern char *strerror  (int __errnum)    ;
extern int errno;
extern int *__errno_location  (void)     __attribute__ ((__const__));
extern void _exit  (int __status)   __attribute__ ((__noreturn__));
extern void exit  (int __status)     __attribute__ ((__noreturn__));
extern int close  (int __fd)    ;
extern int dup  (int __fd)    ;
extern int open  (__const char *__file, int __oflag, ...)    ;


char	myname[]="foo";

detach()
{
	switch(fork()) {
	    case -1:
		printf("%s: Error: fork - %s\n",myname, strerror((*__errno_location ()) ));
		exit(255);
	    case 0:
		 
		close(0);
		close(1);
		close(2);
		dup(dup(open("/dev/null", 02 )));
		return;
	    default:
		 
		_exit(0);
	}
}
