[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
FIFO race condition on SunOS kernels
From: |
Martijn Dekker |
Subject: |
FIFO race condition on SunOS kernels |
Date: |
Mon, 31 Dec 2018 18:37:42 +0100 |
User-agent: |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 |
You'd think that establishing a pipe between two processes is a very
basic UNIX feature that should work reliably on all UNIX variants.
But the following script seems to break consistently on Solaris and
variants (SunOS kernels) when executed by bash, ksh93, or dash. All it
does is make 100 FIFOs and read a line from each -- it should be trivial.
And it does work fine on (recent versions of) Linux, macOS, and all the
BSDs, on all shells.
#! /bin/sh
tmpdir=/tmp/FIFOs$$
trap "exec rm -rf $tmpdir" EXIT INT PIPE TERM
mkdir "$tmpdir" || exit
i=0; while test "$((i+=1))" -le 100; do
fifo=$tmpdir/FIFO$i
mkfifo "$fifo" || exit
echo "this is FIFO $i" >"$fifo" &
read foo <"$fifo" && echo "$foo"
done
Tested on Solaris 10.1, 11.3 and 11.4 and on OpenIndiana, all on
VirtualBox. They all fail in identical ways.
ksh93 (which is /bin/sh on Solaris) doesn't cope with the script either
but hangs slightly later. dash goes through all of them bust most fail
with 'interrupted system call'. However, zsh, yash, and /usr/xpg4/bin/sh
(ksh88) execute the script correctly on Solaris -- but about 20 times as
slowly as on other OSs.
This makes me suspect the SunOS kernel must have some very bad race
condition involving FIFOs, but some shells work around it.
Would it be possible to fix this on bash 5?
- M.
- FIFO race condition on SunOS kernels,
Martijn Dekker <=