From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50594) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xxvff-0003xo-60 for qemu-devel@nongnu.org; Mon, 08 Dec 2014 05:36:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XxvfZ-0001bX-0t for qemu-devel@nongnu.org; Mon, 08 Dec 2014 05:36:03 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36312) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XxvfY-0001bT-Pb for qemu-devel@nongnu.org; Mon, 08 Dec 2014 05:35:56 -0500 Date: Mon, 8 Dec 2014 18:34:49 +0800 From: Fam Zheng Message-ID: <20141208103449.GA8616@ad.nay.redhat.com> References: <1418032092-16813-1-git-send-email-mreitz@redhat.com> <1418032092-16813-2-git-send-email-mreitz@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1418032092-16813-2-git-send-email-mreitz@redhat.com> Subject: Re: [Qemu-devel] [PATCH v3 1/3] qemu-io: Add sigraise command List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Max Reitz Cc: Kevin Wolf , Markus Armbruster , qemu-devel@nongnu.org, Stefan Hajnoczi , Michael =?iso-8859-1?Q?M=FCller?= On Mon, 12/08 10:48, Max Reitz wrote: > abort() has the sometimes undesirable side-effect of generating a core > dump. If that is not needed, SIGKILL has the same effect of abruptly > crash qemu; without a core dump. > > Thus, -c abort is not always useful to simulate a qemu-io crash; > therefore, this patch adds a new sigraise command which allows raising > a signal. > > Signed-off-by: Max Reitz > --- > qemu-io-cmds.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 46 insertions(+) > > diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c > index d94fb1e..e708552 100644 > --- a/qemu-io-cmds.c > +++ b/qemu-io-cmds.c > @@ -2048,6 +2048,51 @@ static const cmdinfo_t abort_cmd = { > .oneline = "simulate a program crash using abort(3)", > }; > > +static void sigraise_help(void) > +{ > + printf( > +"\n" > +" raises the given signal\n" > +"\n" > +" Example:\n" > +" 'sigraise %i' - raises SIGTERM\n" > +"\n" > +" Invokes raise(signal), where \"signal\" is the mandatory integer argument\n" > +" given to sigraise.\n" > +"\n", SIGTERM); > +} > + > +static int sigraise_f(BlockDriverState *bs, int argc, char **argv); > + > +static const cmdinfo_t sigraise_cmd = { > + .name = "sigraise", > + .cfunc = sigraise_f, > + .argmin = 1, > + .argmax = 1, > + .flags = CMD_NOFILE_OK, > + .args = "signal", > + .oneline = "raises a signal", > + .help = sigraise_help, > +}; > + > +static int sigraise_f(BlockDriverState *bs, int argc, char **argv) > +{ > + int sig = cvtnum(argv[0]); > + if (sig < 0) { > + printf("non-numeric signal number argument -- %s\n", argv[1]); > + return 0; > + } > + > + /* Using raise() to kill this process does not necessarily flush all open > + * streams. At least stdout and stderr (although the latter should be > + * non-buffered anyway) should be flushed, though. */ > + fflush(stdout); > + fflush(stderr); > + > + raise(sig); > + return 0; > +} > + > static void sleep_cb(void *opaque) > { > bool *expired = opaque; > @@ -2202,4 +2247,5 @@ static void __attribute((constructor)) init_qemuio_commands(void) > qemuio_add_command(&wait_break_cmd); > qemuio_add_command(&abort_cmd); > qemuio_add_command(&sleep_cmd); > + qemuio_add_command(&sigraise_cmd); > } > -- > 1.9.3 > > Reviewed-by: Fam Zheng