Re: RFC: implement daemon() in the kernel

From: H. Peter Anvin
Date: Mon Nov 20 2006 - 19:39:13 EST


Simon Richter wrote:

- daemonize a process

There is a function called daemon() that does this; its behaviour is
roughly defined by (modulo error handling)

int daemon(int nochdir, int noclose)
{
if(!nochdir)
chdir("/");

if(!noclose)
{
int fd = open("/dev/null", O_RDWR);
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
close(fd);
}

if(fork() > 0)

... that should be if (fork() == 0) ...

_exit(0);

setsid();
}



Since it calls _exit() right after fork() returns (so daemon() never
returns to the calling process except in case of an error) it would be
possible to implement this on MMUless machines if the last two lines
could happen in the kernel.


You could do this quite easily with clone() and a small assembly wrapper.

The assembly wrapper needs to do the last two lines without touching the stack in the parent. That is usually quite trivial, even on register-starved architectures; for example, on i386 it would look like (ignoring vsyscalls for the moment, which are only an optimization anyway).

__detach_from_parent:
pushl %ebx
movl $__NR_clone, %eax
movl $CLONE_VM|SIGCHLD, %ebx
xorl %ecx, %ecx
int $0x80
cmpl $-4096, %eax
ja 1f
andl %eax, %eax
je 2f
# Parent process, must _exit(0)
xorl %ebx, %ebx
movl $__NR_exit, %eax
int $0x80
# _exit() should never return
hlt
1: # Error on fork(), set errno and return -1
negl %eax
movl %eax, errno # Or TLS equivalent
orl $-1, %eax
2: # Child process jumps here with %eax == 0 already
popl %ebx
ret

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/