[CRIU] [PATCH] zdtm: Fix fd01 cleanup

Andrei Vagin avagin at virtuozzo.com
Wed Jan 31 21:20:35 MSK 2018


On Tue, Jan 30, 2018 at 06:19:31PM +0300, Kirill Tkhai wrote:
> 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 |   17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/test/zdtm/static/fd01.c b/test/zdtm/static/fd01.c
> index 7f0256a03..390d9d126 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,10 +103,9 @@ 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) /* Ignore errors */
> +		;

Pls, check an exit code from children, otherwise it isn't a test,
because it nevel fails. In addition, it would be good if you add
basic checks to be sure that file descriptors are restored correctly.

>  
>  	pass();
>  
> 


More information about the CRIU mailing list