[GHC] #3081: Double output after Ctrl+C on Windows
Simon Marlow
marlowsd at gmail.com
Tue Mar 17 05:02:36 EDT 2009
Neil Mitchell wrote:
>>> system "cp foo foo.bup" >> deleteFile "foo"
>>>
>>> If I Ctrl+C during the cp did I just delete my one copy of foo?
>> On Windows, Ctrl-C will unblock a blocked system call. e.g. read() returns
>> with zero. Apparently system "foo" also returns as soon as you press
>> Ctrl-C, I'm not entirely sure why. Perhaps because the program has been
>> killed?
>
> So, to check my understanding:
>
> * Haskell program invokes system
> * Use presses Ctrl+C
> * System returns and Haskell program continues executing
> * Ctrl+C is thrown and Haskell program aborts
Yes.
> That sounds really dangerous - like a race condition between the
> system returning and the Haskell program aborting.
I don't know why system returns, but one valid reason would be if the child
process had died due to the same Ctrl-C. As Duncan says, in this case we
ought to raise the Ctrl-C exception in the parent, but (a) none of this is
implemented in the current process library, and (b) I'm not sure if you can
tell whether a child died due to Ctrl-C on Windows.
Also since Windows has no process groups, I don't think system is returning
as a result of the child dying. It's more likely to be returning because
of some silly Win32ism, like the way read() returns 0 on Windows when you
press Ctrl-C. The latter also leads to very strange behaviour unless you
check for it (which we don't, and we probably should).
Consoles are very weird on Windows. Ctrl-C doesn't even work at all in
MSYS or (certain types of) Cygwin windows, or xterms - it kills the
program, but the program doesn't get a signal.
Cheers,
Simon
More information about the Glasgow-haskell-bugs
mailing list