我正在尝试编写一个程序,使用 将其分为子进程和父进程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() 或自行退出,它们应该会消失。