From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933521AbcIVIrT (ORCPT ); Thu, 22 Sep 2016 04:47:19 -0400 Received: from atlantic540.startdedicated.de ([188.138.9.77]:43340 "EHLO atlantic540.startdedicated.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933377AbcIVIqy (ORCPT ); Thu, 22 Sep 2016 04:46:54 -0400 From: Daniel Wagner To: Jeff Layton Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Daniel Wagner Subject: [PATCH v0 3/3] posix03: Do not kill everything in the process group Date: Thu, 22 Sep 2016 10:46:07 +0200 Message-Id: <1474533967-4404-4-git-send-email-wagi@monom.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1474533967-4404-1-git-send-email-wagi@monom.org> References: <1474533967-4404-1-git-send-email-wagi@monom.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Daniel Wagner kill(0, SIGINT) sends to all in the process group the signal including the parent shell. Instead remember the PIDs of all children and just send the signal to these processes. Reported-by: Dave Chinner Signed-off-by: Daniel Wagner --- posix03.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/posix03.c b/posix03.c index a36caa5..4ee130b 100644 --- a/posix03.c +++ b/posix03.c @@ -71,13 +71,18 @@ static int fcntl_unlock(int fd, off_t off, off_t len) return fcntl(fd, F_SETLKW, &fl); } +/* The PIDs of all children */ +static pid_t *cpids; + static void kill_children() { siginfo_t infop; + int i; signal(SIGINT, SIG_IGN); - kill(0, SIGINT); + for (i = 0; cpids[i]; i++) + kill(cpids[i], SIGINT); while (waitid(P_ALL, 0, &infop, WEXITED) != -1); } @@ -161,14 +166,21 @@ int main(int argc, char *argv[]) signal(SIGINT, sighandler); + cpids = malloc((num + 1) * sizeof(pid_t)); + if (!cpids) + err(1, "malloc"); + cpids[num] = 0; + for (i = 0; i < num; i++) { - switch (fork()) { + pid_t pid = fork(); + switch (pid) { case 0: signal(SIGINT, SIG_DFL); return do_child(lockfd, i, to_lockers[0], from_lockers[1]); case -1: err(1, "fork failed"); } + cpids[i] = pid; } close(to_lockers[0]); @@ -208,5 +220,6 @@ int main(int argc, char *argv[]) printf("%ld.%09ld\n", total.tv_sec, total.tv_nsec); kill_children(); + free(cpids); return 0; } -- 2.5.5