sudo 命令使子进程变为僵尸进程

sudo 命令使子进程变为僵尸进程

我正在尝试编写一个程序,使用 将其分为子进程和父进程fork()。子进程使用 执行参数execv(),父进程使用 跟踪子进程ptrace()。我编写了程序的几乎所有部分,但sudo命令参数除外。

例如,当我编写命令时./my_program apt-get update,它运行良好。当我编写命令时./my_program sudo apt-get update,命令输出停留在“正在读取状态信息...完成”并停止。如果我用终止它Ctrl C,它会变成僵尸进程。
此外,stace ./my_program sudo apt-get update不起作用,但stace -f ./my_program sudo apt-get update运行良好。

有没有办法通过编辑 C 代码来解决此错误?不是像这样的命令kill -9

环境

  • Docker(Windows)
  • Ubuntu 18.04.6 LTS
  • /home/ 中的文件

答案1

您不能使用 strace 和 ptrace 越过安全边界(例如使用 sudo 创建的安全边界)。允许这样做会造成非常大的安全漏洞。

如果您确实需要这样做,您将需要在 sudo 之后运行 ptrace/strace,以便两个进程处于相同的安全上下文中。

僵尸进程大多无害,之所以存在是因为父进程(无论出于何种原因)没有注意到子进程已退出。如果父进程调用 wait() 或自行退出,它们应该会消失。

相关内容