diff options
Diffstat (limited to 'tests/posix/readdir_error.sh')
-rw-r--r-- | tests/posix/readdir_error.sh | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/tests/posix/readdir_error.sh b/tests/posix/readdir_error.sh index cca71f0..ce06723 100644 --- a/tests/posix/readdir_error.sh +++ b/tests/posix/readdir_error.sh @@ -1,21 +1,37 @@ +skip_unless test "$UNAME" = "Linux" + clean_scratch -mkfifo scratch/{pid,hup} +mkfifo scratch/{fever,pid,wait,running} ( # Create a zombie process - echo >/dev/null & + cat scratch/fever >/dev/null & # Write the PID to scratch/pid echo $! >scratch/pid - # Don't wait on the processes - exec cat scratch/hup >/dev/null + # Don't wait on the zombie process + exec cat scratch/wait scratch/fever >scratch/running ) & -# Kill cat on exit -trap "echo >scratch/hup" EXIT +# Kill the parent cat on exit +trap "kill -9 %1" EXIT -# Read the zombie PID +# Read the child PID read -r pid <scratch/pid +# Make sure the parent cat is running before we kill the child, because bash +# will wait() on its children +echo >scratch/wait & +read -r _ <scratch/running + +# Turn the child into a zombie +kill -9 "$pid" + +# Wait until it's really a zombie +state=R +while [ "$state" != "Z" ]; do + read -r _ _ state _ <"/proc/$pid/stat" || exit 1 +done + # On Linux, open(/proc/$pid/net) will succeed but readdir() will fail skip_unless test -r "/proc/$pid/net" fail invoke_bfs "/proc/$pid/net" >/dev/null |