我有一个在伪终端中运行的子进程。父进程不以 root 身份运行,但子进程通过 su 或 sudo 运行。因此,不可能向子进程发送信号以强制其退出。我想通过以下方式之一强制它退出:

  • 模拟 Ctrl-C。
  • 模拟终端挂断。

  • 我该怎么做?我已经有一个 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/

    10-17 01:41