[CRIU] [PATCH v2] zdtm: Fix fd01 cleanup
Kirill Tkhai
ktkhai at virtuozzo.com
Thu Feb 1 17:54:12 MSK 2018
zdtm: Fix fd01 cleanup
From: Kirill Tkhai <ktkhai at virtuozzo.com>
waitpid() does not return child pid, when child has not exited.
So, we can't use it to find pids of children.
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
test/zdtm/static/fd01.c | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/test/zdtm/static/fd01.c b/test/zdtm/static/fd01.c
index 7f0256a03..4e7875110 100644
--- a/test/zdtm/static/fd01.c
+++ b/test/zdtm/static/fd01.c
@@ -22,11 +22,19 @@ int main(int argc, char **argv)
unsigned int i, max_nr, flags;
int fd, status, ret;
struct rlimit rlim;
+ futex_t *futex;
char buf[16];
pid_t pid;
test_init(argc, argv);
+ futex = mmap(NULL, sizeof(*futex), PROT_WRITE | PROT_READ, MAP_ANONYMOUS|MAP_SHARED, -1, 0);
+ if (futex == MAP_FAILED) {
+ fail("mmap");
+ exit(1);
+ }
+ futex_init(futex);
+
fd = open("/proc/sys/fs/nr_open", O_RDONLY);
if (fd < 0) {
fail("Can't open /proc/sys/fs/nr_open");
@@ -86,7 +94,7 @@ int main(int argc, char **argv)
fail("fork");
exit(1);
} else if (!pid) {
- pause();
+ futex_wait_while(futex, 0);
exit(0);
}
}
@@ -95,9 +103,12 @@ int main(int argc, char **argv)
test_waitsig();
/* Cleanup */
- while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
- if (kill(pid, SIGTERM) == 0)
- waitpid(-1, &status, 0); /* Ignore errors */
+ futex_set_and_wake(futex, 1);
+ while (wait(&status) > 0) {
+ if (!WIFEXITED(status) || WEXITSTATUS(status)) {
+ fail("Wrong exit status: %d", status);
+ exit(1);
+ }
}
pass();
More information about the CRIU
mailing list