On Jun 20, 2009, at 7:41 AM, Piet van Oostrum wrote:
After my previous experiment I was curious how this works with
input(). I replaced the sem.acquire() with raw_input() and ran the
same
tests. Now the inner exception is really taken so it works like the OP
expected. The exception, however is KeyboardInterrupt, not the special
exception from the IPC module.
So I looked in the source code how they did it:
The code is in Parser/myreadline.c.
This code for input in function calls PyErr_CheckSignals() and
PyOS_InterruptOccurred() for a proper handling of the interrupt. So it
seems the OP should do something similar. Onl;y to deliver the custom
error you will have to do some other stuff. I don't know what but
maybe
calling PyErr_SetString is sufficient as it might overwrite the
KeyboardInterrupt stuff.
Thank you Greg and especially Piet for going to the trouble of
installing posix_ipc and experimenting with it.
Piet, your research into raw_input() gave me a solution.
In my C code, I added a call to PyErr_CheckSignals() as the first line
inside the "case EINTR". Apparently calling PyErr_CheckSignals() sets
the Python error indicator -- PyErr_Occurred() returns true and the
error is PyExc_KeyboardInterrupt. I'm able to clear that error and
return my own.
Prior to adding the call to PyErr_CheckSignals(), PyErr_Occurred()
returned false, so my code had no error to clear.
Best of all, PyErr_CheckSignals() doesn't interfere with a Python-
level signal handler if one is set.
This worked under OS X and Linux.
I'll have to think some more about exactly how I want my module to
report the Ctrl-C, but at least now I have the tools to control the
situation.
Thanks again for your invaluable assistance. If I'm ever in NL or NZ
I'll buy you a beer. =)
Cheers
Philip
--
http://mail.python.org/mailman/listinfo/python-list