gspawn: Retry on EBUSY errors from dup2()

`man dup2` says that on Linux, dup2() can return `EBUSY` if the
operation needs to be retried (in addition to returning `EINTR` in other
cases where it needs to be retried).

Signed-off-by: Philip Withnall <withnall@endlessm.com>
12 jobs for gspawn in 43 minutes (queued for 1 second)
Status Job ID Name Coverage
  Build
passed #446320
cross-android_api21_arm64

00:01:33

passed #446321
cross-android_api28_arm64

00:01:32

passed #446322
cross-mingw64

00:03:17

passed #446318
debian-stable-x86_64

00:03:53

passed #446333
fedora-x86_64

00:04:10

passed #446319
G_DISABLE_ASSERT

00:02:23

passed #446323
win32
msys2-mingw32

00:13:39

passed #446324
win32
vs2017-x64

00:09:48

failed #446317
fedora-x86_64

00:03:35

 
  Coverage
passed #446325
coverage

00:01:24

77.9%
 
  Analysis
passed #446327
scan-build

00:16:21

failed #446326
allowed to fail
valgrind

00:23:45

 
Name Stage Failure
failed
valgrind Analysis
Uploading artifacts...
_build/config.h: found 1 matching files
_build/glib/glibconfig.h: found 1 matching files

_build/meson-logs: found 7 matching files

Uploading artifacts to coordinator... ok
id=446326 responseStatus=201 Created token=2s4ChK1z
Uploading artifacts...
_build/valgrind-report.xml: found 1 matching files

Uploading artifacts to coordinator... ok
id=446326 responseStatus=201 Created token=2s4ChK1z
ERROR: Job failed: exit code 1