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