Commit f7cce898821ff2a050e3de7317fe05b1a3e155fb
1 parent
fe2cece6
-pidfile option
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1166 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
51 additions
and
1 deletions
qemu-doc.texi
vl.c
... | ... | @@ -1667,6 +1667,46 @@ static int net_fd_init(NetDriverState *nd, int fd) |
1667 | 1667 | #endif /* !_WIN32 */ |
1668 | 1668 | |
1669 | 1669 | /***********************************************************/ |
1670 | +/* pid file */ | |
1671 | + | |
1672 | +static char *pid_filename; | |
1673 | + | |
1674 | +/* Remove PID file. Called on normal exit */ | |
1675 | + | |
1676 | +static void remove_pidfile(void) | |
1677 | +{ | |
1678 | + unlink (pid_filename); | |
1679 | +} | |
1680 | + | |
1681 | +static void create_pidfile(const char *filename) | |
1682 | +{ | |
1683 | + struct stat pidstat; | |
1684 | + FILE *f; | |
1685 | + | |
1686 | + /* Try to write our PID to the named file */ | |
1687 | + if (stat(filename, &pidstat) < 0) { | |
1688 | + if (errno == ENOENT) { | |
1689 | + if ((f = fopen (filename, "w")) == NULL) { | |
1690 | + perror("Opening pidfile"); | |
1691 | + exit(1); | |
1692 | + } | |
1693 | + fprintf(f, "%d\n", getpid()); | |
1694 | + fclose(f); | |
1695 | + pid_filename = qemu_strdup(filename); | |
1696 | + if (!pid_filename) { | |
1697 | + fprintf(stderr, "Could not save PID filename"); | |
1698 | + exit(1); | |
1699 | + } | |
1700 | + atexit(remove_pidfile); | |
1701 | + } | |
1702 | + } else { | |
1703 | + fprintf(stderr, "%s already exists. Remove it and try again.\n", | |
1704 | + filename); | |
1705 | + exit(1); | |
1706 | + } | |
1707 | +} | |
1708 | + | |
1709 | +/***********************************************************/ | |
1670 | 1710 | /* dumb display */ |
1671 | 1711 | |
1672 | 1712 | static void dumb_update(DisplayState *ds, int x, int y, int w, int h) |
... | ... | @@ -2533,6 +2573,7 @@ void help(void) |
2533 | 2573 | "Debug/Expert options:\n" |
2534 | 2574 | "-monitor dev redirect the monitor to char device 'dev'\n" |
2535 | 2575 | "-serial dev redirect the serial port to char device 'dev'\n" |
2576 | + "-pidfile file Write PID to 'file'\n" | |
2536 | 2577 | "-S freeze CPU at startup (use 'c' to start execution)\n" |
2537 | 2578 | "-s wait gdb connection to port %d\n" |
2538 | 2579 | "-p port change gdb connection port\n" |
... | ... | @@ -2625,6 +2666,7 @@ enum { |
2625 | 2666 | QEMU_OPTION_serial, |
2626 | 2667 | QEMU_OPTION_loadvm, |
2627 | 2668 | QEMU_OPTION_full_screen, |
2669 | + QEMU_OPTION_pidfile, | |
2628 | 2670 | }; |
2629 | 2671 | |
2630 | 2672 | typedef struct QEMUOption { |
... | ... | @@ -2685,7 +2727,8 @@ const QEMUOption qemu_options[] = { |
2685 | 2727 | { "serial", 1, QEMU_OPTION_serial }, |
2686 | 2728 | { "loadvm", HAS_ARG, QEMU_OPTION_loadvm }, |
2687 | 2729 | { "full-screen", 0, QEMU_OPTION_full_screen }, |
2688 | - | |
2730 | + { "pidfile", HAS_ARG, QEMU_OPTION_pidfile }, | |
2731 | + | |
2689 | 2732 | /* temporary options */ |
2690 | 2733 | { "pci", 0, QEMU_OPTION_pci }, |
2691 | 2734 | { "cirrusvga", 0, QEMU_OPTION_cirrusvga }, |
... | ... | @@ -3110,6 +3153,9 @@ int main(int argc, char **argv) |
3110 | 3153 | case QEMU_OPTION_full_screen: |
3111 | 3154 | full_screen = 1; |
3112 | 3155 | break; |
3156 | + case QEMU_OPTION_pidfile: | |
3157 | + create_pidfile(optarg); | |
3158 | + break; | |
3113 | 3159 | } |
3114 | 3160 | } |
3115 | 3161 | } | ... | ... |