bug-bash
[Top][All Lists]
Advanced

[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.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]