Hi Roland,
I get randomly a race
reparent-zombie: reparent-zombie.c:88: create_zombie: Assertion `fd !=
-1' failed.
Aborted
on kernel-2.6.25.3-18.fc9.x86_64.
I hope the attached patch is right (tested only for reparent-zombie.c as
reparent-zombie-clone.c is crashing the kernel).
Best Regards,
Jan
--- tests/reparent-zombie.c 2 May 2008 01:27:20 - 1.1
+++ tests/reparent-zombie.c 2 Jun 2008 12:40:01 -
@@ -78,15 +78,19 @@ create_zombie (void)
assert (WIFSTOPPED (status));
assert (WSTOPSIG (status) == SIGUSR1);
+ /* We must open the status file first as if CHILD would finish in between
+ TRACE_CONT and this OPEN we would fail with ENOSRCH as no zombie is left
+ as we have set the SIGCHLD handler to SIG_IGN (kernel reaps the died
+ children without creating any zombies. */
+ snprintf (buf, sizeof buf, /proc/%d/status, (int) child);
+ fd = open (buf, O_RDONLY);
+ assert (fd != -1);
+
errno = 0;
l = ptrace (PTRACE_CONT, child, 0l, 0l);
assert_perror (errno);
assert (l == 0);
- snprintf (buf, sizeof buf, /proc/%d/status, (int) child);
- fd = open (buf, O_RDONLY);
- assert (fd != -1);
-
do
{
sched_yield ();
@@ -173,6 +177,8 @@ main (void)
signal (SIGABRT, handler_fail);
signal (SIGALRM, handler_fail);
+ /* SIG_IGN as we want no zombies left - kernel reaps the died children
+ without creating any zombies. */
signal (SIGCHLD, SIG_IGN);
fd = create_zombie ();
--- tests/reparent-zombie-clone.c 2 May 2008 01:27:20 - 1.1
+++ tests/reparent-zombie-clone.c 2 Jun 2008 12:44:15 -
@@ -123,6 +123,14 @@ create_zombie (void)
assert (WIFSTOPPED (status));
assert (WSTOPSIG (status) == SIGSTOP);
+ /* We must open the status file first as if MSG would finish in between
+ TRACE_CONT and this OPEN we would fail with ENOSRCH as no zombie is left
+ as we have set the SIGCHLD handler to SIG_IGN (kernel reaps the died
+ children without creating any zombies. */
+ snprintf (buf, sizeof buf, /proc/%d/status, (int) msg);
+ fd = open (buf, O_RDONLY);
+ assert (fd != -1);
+
errno = 0;
l = ptrace (PTRACE_CONT, msg, 0l, 0l);
assert_perror (errno);
@@ -135,10 +143,6 @@ create_zombie (void)
child = msg;
- snprintf (buf, sizeof buf, /proc/%d/status, (int) child);
- fd = open (buf, O_RDONLY);
- assert (fd != -1);
-
do
{
sched_yield ();
@@ -225,6 +229,8 @@ main (void)
signal (SIGABRT, handler_fail);
signal (SIGALRM, handler_fail);
+ /* SIG_IGN as we want no zombies left - kernel reaps the died children
+ without creating any zombies. */
signal (SIGCHLD, SIG_IGN);
fd = create_zombie ();