using filedescriptors in SIGINT signal handler

Bram Stolk bram at geenspam.sara.nl
Tue Sep 13 10:01:17 EDT 2005


jepler at unpythonic.net wrote:
> If you're talking about a Python function registered as a handler by
> signal.signal, then there should not be any restrictions on what you do
> in that function.
> 
> Here's a small program I wrote:
> #------------------------------------------------------------------------
> import os, signal, time
> 
> def h(*args): os.write(fd, "data\n");
> 
> print "my pid is", os.getpid()
> subproc = os.popen("cat -n", "w")
> fd = subproc.fileno()
>  
> signal.signal(signal.SIGINT, h)
> 
> while 1:
>     time.sleep(1)
> #------------------------------------------------------------------------
> 
> I ran this and in another terminal I repeatedly typed 'kill -INT nnnn',
> where nnnn is the pid printed by my program.  Each time, another line is
> output by 'cat'.
> 
> When I try to deliver the signal by hitting ctrl-c in that terminal, the
> first time nothing happens and the second time I get the message
> 	OSError: [Errno 32] Broken pipe
> in this case, I believe that the first signal was delivered to cat,
> causing it to exit.  The second signal was delivered to the python
> program, which obviously couldn't write to the stdin of a process that
> had exited.

Ah!
ofcourse...

It makes sense now to me.
I, indeed, used Ctrl-C, and assumed it would go to python, not
the child process. Wrong assumption ofcourse.

Thanks.

   Bram

> 
> Jeff



More information about the Python-list mailing list