我在 C++ 程序中有一个信号处理程序:
void term(int signum)
{
cout << "in term" << endl;
# Do Stuff
exit(0);
}
int main(int argc, char *argv[])
{
# Do Stuff
signal(SIGINT, term);
# Do Stuff
}
该程序运行良好。当我按下Ctrl+C并退出时进入功能项。
但是,当我尝试使用脚本复制该行为时,它不起作用。
我正在运行的脚本的简化版本:
! /bin/bash
sudo ./program &
rpid=$!
sleep 2
sudo kill -INT $rpid
# sudo kill -TERM $rpid
# sudo kill $rpid
echo "killed"
wait $rpid
在我按 之前,该程序甚至不会进入术语功能Ctrl+C。它无限期地陷入等待状态。
答案1
% sudo sh -c 'exec echo 我的进程 ID 是 $$。' & echo "Xyr 进程 ID 是 $\!." ;等待 [1]59130 Xyr 进程 ID 为 59130。 我的进程 ID 是 59131。 [1] + 完成 sudo sh -c 'exec echo 我的进程 ID 是 $$。' %
欢迎来到可插入身份验证模块的世界!login
、su
、 和等程序sudo
不再与目标程序重叠。
您正在向错误的进程发送信号。
进一步阅读
- 乔纳森·德博因·波拉德 (2014)。 “二十多年前,PAM 改变了一切。”。不要滥用 su 来删除用户权限。常见答案。
- 如何执行 sudo + exec?