如何将Ctrl-C控制字符或终端挂断消息发送到子进程?

Hon*_*gli 10 c posix pty

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

  • 模拟Ctrl-C.
  • 模仿终端挂断.

我该怎么做?我已经有一个pty master fd,我尝试过这样的事情:

write(master, &termios.c_cc[VINTR], 1)
Run Code Online (Sandbox Code Playgroud)

但它没有做任何事情.

Hon*_*gli 2

我最终采用了以下解决方案:

分叉后,我不是立即执行 sudo,而是 exec() 一个辅助子进程,该子进程又分叉并执行 sudo 并在其上调用 waitpid。所以进程层次结构如下所示:

original process          <---- runs as user
  |
  +-- helper process      <---- runs as user, session leader,
         |                      has own pty, in pty's foreground process group
         |
         +--- sudo        <---- runs as root
Run Code Online (Sandbox Code Playgroud)

通过终止辅助进程,pty 不再有前台进程。这将导致操作系统向整个前台进程组发送 SIGHUP,而不管用户是谁,因此 sudo 也会发出 SIGHUP 信号。