[MLton] SIGPIPE causes incompatibility with basis library spec

Stephen Weeks MLton@mlton.org
Fri, 19 Nov 2004 17:00:46 -0800

The basis library spec requires functions like Socket.sendVec to raise
an exception if they fail.  However, with MLton (on Linux anyway),
sending to a socket that hasn't yet been connected causes a SIGPIPE
signal, which causes the program to die.  For example, the following
program does not print "exception" as it should.

val buf = Word8VectorSlice.full (Byte.stringToBytes "test\n")
val sock : Socket.active INetSock.stream_sock = INetSock.TCP.socket ()
val sentLen = Socket.sendVec (sock, buf) handle x => (print "exception\n"; 0)
val _ = print "done\n"

The default signal handler on Linux for SIGPIPE cause the program to

Should we do the following in our basis library implementation to be
more compliant?

       open MLton.Signal
       setHandler (Posix.Signal.pipe, Handler.ignore)