This is the standard usage of pipe. pipe opens two connected file descriptors, and returns these fds in the array that's the argument to pipe. The process then forks, the parent closes one, the child closes the other, and they talk across this pipe.
Since you are only stracing the grub-mkconfig process, and not following forks ('strace -ff'), this trace doesn't show us what's actually hanging.
grub-mkconfig, btw, is a shell script, so it's probably better to debug it using 'sh -x /usr/sbin/grub-mkconfig' instead.
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 17818 stack=0, flags=CLONE_ CHILD_CLEARTID| CLONE_CHILD_ SETTID| SIGCHLD, child_tidptr= 0x7fe3556d7a10) = 17819
pipe([3, 4]) = 0
clone(child_
close(4) = 0
read(3,
This is the standard usage of pipe. pipe opens two connected file descriptors, and returns these fds in the array that's the argument to pipe. The process then forks, the parent closes one, the child closes the other, and they talk across this pipe.
Since you are only stracing the grub-mkconfig process, and not following forks ('strace -ff'), this trace doesn't show us what's actually hanging.
grub-mkconfig, btw, is a shell script, so it's probably better to debug it using 'sh -x /usr/sbin/ grub-mkconfig' instead.