我有一个在伪终端中运行的子进程。父进程不以 root 身份运行,但子进程通过 su 或 sudo 运行。因此,不可能向子进程发送信号以强制其退出。我想通过以下方式之一强制它退出:
我该怎么做?我已经有一个 pty master fd,我尝试过这样的事情:
write(master, &termios.c_cc[VINTR], 1)
但它没有做任何事情。
最佳答案
在我看来,如果您真的有一个 pty(除非您通过伪终端表示其他意思),那么您所要做的就是向该 FD 发送一个 Control-C。为了证明这一点,我在 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 下 fork 了一个进程,该进程运行无限循环打印
日期。然后父节点等待 3 秒并发送一个 control-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 次日期,然后退出。
关于c - 如何向子进程发送 Ctrl-C 控制字符或终端挂断消息?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2195885/