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 | } | ... | ... |