我有一个在伪终端中运行的子进程.父进程不以root身份运行,但子进程通过su或sudo运行.因此,无法向子进程发送信号以强制它退出.我想通过以下方法之一强制退出:
我该怎么做?我已经有一个pty master fd,我尝试过这样的事情:
write(master, &termios.c_cc[VINTR], 1)
Run Code Online (Sandbox Code Playgroud)
但它没有做任何事情.
我最终采用了以下解决方案:
分叉后,我不是立即执行 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 信号。