diff --git a/cmd/raidz_test/raidz_test.c b/cmd/raidz_test/raidz_test.c index 9a8be549c5cb..c1610a8d1b0c 100644 --- a/cmd/raidz_test/raidz_test.c +++ b/cmd/raidz_test/raidz_test.c @@ -37,11 +37,11 @@ static int *rand_data; raidz_test_opts_t rto_opts; -static char gdb[256]; -static const char gdb_tmpl[] = "gdb -ex \"set pagination 0\" -p %d"; +static char pid_s[16]; static void sig_handler(int signo) { + int old_errno = errno; struct sigaction action; /* * Restore default action and re-raise signal so SIGSEGV and @@ -52,10 +52,19 @@ static void sig_handler(int signo) action.sa_flags = 0; (void) sigaction(signo, &action, NULL); - if (rto_opts.rto_gdb) - if (system(gdb)) { } + if (rto_opts.rto_gdb) { + pid_t pid = fork(); + if (pid == 0) { + execlp("gdb", "gdb", "-ex", "set pagination 0", + "-p", pid_s, NULL); + _exit(-1); + } else if (pid > 0) + while (waitpid(pid, NULL, 0) == -1 && errno == EINTR) + ; + } raise(signo); + errno = old_errno; } static void print_opts(raidz_test_opts_t *opts, boolean_t force) @@ -978,8 +987,8 @@ main(int argc, char **argv) struct sigaction action; int err = 0; - /* init gdb string early */ - (void) sprintf(gdb, gdb_tmpl, getpid()); + /* init gdb pid string early */ + (void) sprintf(pid_s, "%d", getpid()); action.sa_handler = sig_handler; sigemptyset(&action.sa_mask);