Sending C-c to Emacs

L

lorinh

Hi all,

I've written a Python script with functionality similar to the Unix
"script" program, which keeps a record of shell commands issued (I
capture some additional stuff like timestamps). The code is borrowed
largely from
http://groups.google.com/group/comp.lang.python/msg/de40b36c6f0c53cc

Anyways, one problem is that it doesn't handle Control-C correctly.
This is a particular problem when invoking Emacs since C-x C-c is the
sequence to exit Emacs. Catching the KeyboardInterrupt and doing
os.kill(pid,signal.SIGINT) doesn't seem to do the trick.

A simplified version of the program looks something like this (I've
eliminated the parts where I log the data to a file and some
tty-related cleanup stuff, this is just shuffling data between user
and shell)

import select,os,pty
shell = '/bin/bash'
pid, fd = pty.fork()
if pid == 0:
os.execvp(shell,(shell,))

# various tty magic goes here

exit = 0
while True:
r, w, e = select.select([0, fd], [], [], 1)
for File in r:
if File == 0:
from_user = os.read(0, bufsize)
os.write(fd, from_user)
elif File==fd:
try:
from_shell = os.read(fd, bufsize)
os.write(1, from_shell)
if from_shell=='':
exit=1
except OSError:
exit=1
if exit==1:
break


The problem is that this doesn't work when the user hits Control-C. I
thought the solution would be to send the child process a SIGINT, and I
tried to do that as follows:

try:
r, w, e = select.select([0, fd], [], [], 1)
...
except KeyboardInterrupt:
os.kill(pid,signal.SIGINT)


But that doesn't have the desired effect. When I have this code here,
it's as if I never hit Control-C at all. What's the proper way to pass
the Control-C to the child process?

Thanks,

Lorin Hochstein
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,982
Messages
2,570,186
Members
46,739
Latest member
Clint8040

Latest Threads

Top