[CRIU] [PATCH] util: block SIGCHLD to run a sub process
Kirill Tkhai
ktkhai at virtuozzo.com
Thu Mar 30 02:05:22 PDT 2017
On 30.03.2017 08:48, Andrei Vagin wrote:
> From: Andrei Vagin <avagin at virtuozzo.com>
>
> CRIU sets a sigchld handler and calls waitpid from it,
> but when we call a sub-process, we want to wait it
>
> Cc: Kirill Tkhai <ktkhai at virtuozzo.com>
> Signed-off-by: Andrei Vagin <avagin at virtuozzo.com>
Ok for idea, but, please, see comments below.
> ---
> criu/util.c | 26 +++++++++++++++++++++++---
> 1 file changed, 23 insertions(+), 3 deletions(-)
>
> diff --git a/criu/util.c b/criu/util.c
> index 558d498..c014a5d 100644
> --- a/criu/util.c
> +++ b/criu/util.c
> @@ -1369,6 +1369,7 @@ int open_fd_of_real_pid(pid_t pid, int fd, int flags)
>
> int call_in_child_process(int (*fn)(void *), void *arg)
> {
> + sigset_t blockmask, oldmask;
> int size, status, ret = -1;
> char *stack;
> pid_t pid;
> @@ -1379,14 +1380,27 @@ int call_in_child_process(int (*fn)(void *), void *arg)
> pr_perror("Can't allocate stack");
> return -1;
> }
> +
> + sigemptyset(&blockmask);
> + sigaddset(&blockmask, SIGCHLD);
> +
> + if (sigprocmask(SIG_BLOCK, &blockmask, &oldmask) == -1) {
> + pr_perror("Can not set mask of blocked signals");
> + goto out_munmap;
> + }
> +
> pid = clone(fn, stack + size, CLONE_VM | CLONE_FILES | SIGCHLD, arg);
> if (pid == -1) {
> pr_perror("Can't clone");
> - goto out_munmap;
> + goto out_unblock;
> }
> errno = 0;
Not need to clear errno, if there are two separate "if" and "pr_perror".
> - if (waitpid(pid, &status, 0) != pid || !WIFEXITED(status) || WEXITSTATUS(status)) {
> - pr_err("Can't wait or bad status: errno=%d, status=%d", errno, status);
> + if (waitpid(pid, &status, 0) != pid) {
> + pr_perror("Unable to wait %d", pid);
> + goto out_close;
> + }
> + if ( !WIFEXITED(status) || WEXITSTATUS(status)) {
> + pr_err("Can't wait or bad status: errno=%d (%s), status=%d", errno, strerror(errno), status);
Not need to print errno as it's already in the first "if".
> goto out_close;
> }
> ret = 0;
> @@ -1396,8 +1410,14 @@ out_close:
> * with the same pid later, it will try to reuse this /proc/self.
> */
> close_pid_proc();
> +out_unblock:
> + if (sigprocmask(SIG_SETMASK, &oldmask, NULL) == -1) {
> + pr_perror("Can not unset mask of blocked signals");
> + ret = -1;
> + }
> out_munmap:
> munmap(stack, size);
> +
> return ret;
> }
>
>
More information about the CRIU
mailing list