我有一个运行在伪终端的子进程.父进程不以root身份运行,但子进程通过su或sudo运行.因此,不可能向子进程发送一个信号来强制它退出.我想强迫它退出这些手段之一:
>模拟Ctrl-C.
>模拟终端挂机.
我该如何做这些?我已经有一个主人fd,我已经尝试过这样的事情:
write(master,&termios.c_cc[VINTR],1)
但它没有做任何事情.
解决方法
在我看来,如果你真的有一个pty(除非你的意思是伪终端),那么你所要做的就是将Control-C发送到该FD.作为这一点的证据,我在Python中提交了以下代码(但是相当接近C所需的代码):
import pty,os,sys,time pid,fd = pty.fork() if pid == 0: os.execv('/bin/sh',['/bin/sh','-c','while true; do date; sleep 1; done']) sys.exit(0) time.sleep(3) os.write(fd,'^C') print 'results:',os.read(fd,1024)
这在一个pty下划分一个进程,它运行无限循环打印
日期.然后父母等待3秒钟并发送控件C.
这导致以下输出:
guin:/tmp$time python /tmp/foo results: Fri Feb 5 08:28:09 MST 2010 Fri Feb 5 08:28:10 MST 2010 Fri Feb 5 08:28:11 MST 2010 python /tmp/foo 0.02s user 0.01s system 1% cpu 3.042 total guin:/tmp$
运行时间只有3秒钟,打印日期3次,并退出.