On 01/14/2012 01:39 PM, Michael Tokarev wrote:
if (pid == 0) { - close(stderr_fd[0]); - ret = qemu_daemon(0, 0); - - /* Temporarily redirect stderr to the parent's pipe... */ - dup2(stderr_fd[1], STDERR_FILENO); - if (ret == -1) { + int nullfd = open("/dev/null", O_RDWR); + if (nullfd< 0 || setsid()< 0) { err(EXIT_FAILURE, "Failed to daemonize"); }
This is forking only once.
- - /* ... close the descriptor we inherited and go on. */ - close(stderr_fd[1]); - } else { - bool errors = false; - char *buf; - - /* In the parent. Print error messages from the child until - * it closes the pipe. + /* redirect stdin from /dev/null, + * stdout (temporarily) to the pipe to parent,
This is a bit of a hack.
+ /* now complete the daemonizing procedure. + */ + if (device && !verbose) { + if (chdir("/") < 0) { + err(EXIT_FAILURE, "unable to chdir to /"); + } + /* this redirects stderr to /dev/null */ + dup2(STDIN_FILENO, STDERR_FILENO); + /* this redirects stdout to /dev/null too, and closes parent pipe */ + dup2(STDIN_FILENO, STDOUT_FILENO); + } +
Half of this is already done in client_thread, and that would be the place where you should add dup2(0, 1). Also, the chdir can be moved earlier, after bdrv_open.
Paolo