diff --git a/qemu-doc.texi b/qemu-doc.texi index 9436965eb..6338062cd 100644 --- a/qemu-doc.texi +++ b/qemu-doc.texi @@ -202,6 +202,10 @@ Windows. @item -full-screen Start in full screen. +@item -pidfile file +Store the QEMU process PID in @var{file}. It is useful if you launch QEMU +from a script. + @end table Network options: diff --git a/vl.c b/vl.c index 018fc3143..31d3a2052 100644 --- a/vl.c +++ b/vl.c @@ -1666,6 +1666,46 @@ static int net_fd_init(NetDriverState *nd, int fd) #endif /* !_WIN32 */ +/***********************************************************/ +/* pid file */ + +static char *pid_filename; + +/* Remove PID file. Called on normal exit */ + +static void remove_pidfile(void) +{ + unlink (pid_filename); +} + +static void create_pidfile(const char *filename) +{ + struct stat pidstat; + FILE *f; + + /* Try to write our PID to the named file */ + if (stat(filename, &pidstat) < 0) { + if (errno == ENOENT) { + if ((f = fopen (filename, "w")) == NULL) { + perror("Opening pidfile"); + exit(1); + } + fprintf(f, "%d\n", getpid()); + fclose(f); + pid_filename = qemu_strdup(filename); + if (!pid_filename) { + fprintf(stderr, "Could not save PID filename"); + exit(1); + } + atexit(remove_pidfile); + } + } else { + fprintf(stderr, "%s already exists. Remove it and try again.\n", + filename); + exit(1); + } +} + /***********************************************************/ /* dumb display */ @@ -2533,6 +2573,7 @@ void help(void) "Debug/Expert options:\n" "-monitor dev redirect the monitor to char device 'dev'\n" "-serial dev redirect the serial port to char device 'dev'\n" + "-pidfile file Write PID to 'file'\n" "-S freeze CPU at startup (use 'c' to start execution)\n" "-s wait gdb connection to port %d\n" "-p port change gdb connection port\n" @@ -2625,6 +2666,7 @@ enum { QEMU_OPTION_serial, QEMU_OPTION_loadvm, QEMU_OPTION_full_screen, + QEMU_OPTION_pidfile, }; typedef struct QEMUOption { @@ -2685,7 +2727,8 @@ const QEMUOption qemu_options[] = { { "serial", 1, QEMU_OPTION_serial }, { "loadvm", HAS_ARG, QEMU_OPTION_loadvm }, { "full-screen", 0, QEMU_OPTION_full_screen }, - + { "pidfile", HAS_ARG, QEMU_OPTION_pidfile }, + /* temporary options */ { "pci", 0, QEMU_OPTION_pci }, { "cirrusvga", 0, QEMU_OPTION_cirrusvga }, @@ -3110,6 +3153,9 @@ int main(int argc, char **argv) case QEMU_OPTION_full_screen: full_screen = 1; break; + case QEMU_OPTION_pidfile: + create_pidfile(optarg); + break; } } }