Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > gnu.bash.bug > #15019

FIFO race condition on SunOS kernels

From Martijn Dekker <martijn@inlv.org>
Newsgroups gnu.bash.bug
Subject FIFO race condition on SunOS kernels
Date 2018-12-31 18:37 +0100
Message-ID <mailman.6629.1546277883.1284.bug-bash@gnu.org> (permalink)

Show all headers | View raw


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.

Back to gnu.bash.bug | Previous | Next | Find similar | Unroll thread


Thread

FIFO race condition on SunOS kernels Martijn Dekker <martijn@inlv.org> - 2018-12-31 18:37 +0100

csiph-web