From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41825) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XwpnY-0008EC-KG for qemu-devel@nongnu.org; Fri, 05 Dec 2014 05:07:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XwpnI-0001mP-3H for qemu-devel@nongnu.org; Fri, 05 Dec 2014 05:07:40 -0500 Received: from mx1.redhat.com ([209.132.183.28]:41361) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XwpnH-0001m0-SH for qemu-devel@nongnu.org; Fri, 05 Dec 2014 05:07:24 -0500 Message-ID: <548183D6.3040102@redhat.com> Date: Fri, 05 Dec 2014 11:07:18 +0100 From: Max Reitz MIME-Version: 1.0 References: <1417704542-18337-1-git-send-email-mreitz@redhat.com> <1417704542-18337-2-git-send-email-mreitz@redhat.com> <87oari2zl3.fsf@blackfin.pond.sub.org> In-Reply-To: <87oari2zl3.fsf@blackfin.pond.sub.org> Content-Type: text/plain; charset=iso-8859-15; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2 1/3] qemu-io: Add sigraise command List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Markus Armbruster Cc: Kevin Wolf , qemu-devel@nongnu.org, Stefan Hajnoczi , =?ISO-8859-15?Q?Michael_M=FCller?= On 2014-12-05 at 10:52, Markus Armbruster wrote: > Max Reitz writes: > >> 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 to raise >> any Unix signal. > Nitpick: signals are ISO C, not just UNIX. Yes, but "Unix signal" is what the Wikipedia article is named, so... ;-) >> 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..942b694 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 Unix signal\n" >> +"\n" >> +" Example:\n" >> +" 'sigraise 9' - raises SIGKILL\n" > Assumes SIGKILL is encoded as 9, which is traditionally the case, but > not actually mandated by POSIX. Yes, I know. The best would be to parse the signal like kill(1) does, but that would have been extra difficult and probably not worth the effort. Furthermore, I know there is a song called "kill dash nine", so I guessed it would be enough (at least it'll have to be enough for test 039, thanks to "_supported_os Linux"). > You could avoid hardcoding 9 with > > " 'sigraise %d' - raises SIGKILL\n" > > with a SIGKILL as argument for %d. Clever. Will do. > But then you'd have to face the fact that SIGKILL is POSIX, not ISO C. > The ISO C signals are SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM. > Of these, SIGINT and SIGTERM don't dump core, in case you care. Good to know. I guess I'll just go with SIGKILL anyway, it's ubiquitous enough. >> +"\n" >> +" Invokes raise(signal), where \"signal\" is the mandatory integer argument\n" >> +" given to sigraise.\n" >> +"\n"); >> +} >> + >> +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 Unix signal", >> + .help = sigraise_help, >> +}; >> + >> +static int sigraise_f(BlockDriverState *bs, int argc, char **argv) >> +{ >> + int sig = cvtnum(argv[1]); >> + 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); >> } > Looks good otherwise. Thanks :-) Max