linux - bash 如何使用 CTRL+C 杀死子进程
问题描述
我写了一个简单的程序如下 -
int main(int argc, char* argv[]) {
setuid(0);
setgid(0);
printf("Current uid and euid are %d, %d\n", getuid(), geteuid());
while(1);
}
我将其编译为 root 并使用sudo chmod +s test
.
当这个程序作为非特权用户从 bash 运行时,程序会打印 -
当前 uid 和 euid 为 0, 0
然后陷入无限循环。
但是我仍然可以通过按 Crl+C 来终止这个过程。如果我理解正确,bash(以非特权用户身份运行)应该无法将 SIGINT 发送到根进程。
我也尝试了同样的kill <pid of test>
方法,但失败了。
bash 是如何杀死进程的?父进程和子进程之间是否存在特殊关系?
我还尝试了这个其他包装程序 -
int main(int argc, char* argv[]) {
pid_t p = fork();
if (p == 0) {
char * args[] = {"./test", NULL};
execv("./test", args);
} else {
sleep(4);
int ret = kill(p, 9);
printf("Kill returned = %d\n", ret);
return 0;
}
}
并以非特权用户身份运行它(test
root 设置了 setuid 位)。在这种情况下,父母无法杀死孩子。kill
调用返回 -1 并且进程test
被孤立。
这里发生了什么?bash 有什么特别之处可以杀死它产生的子进程?
解决方案
Bash 不需要任何权限,因为 bash 没有做任何事情。当您点击 ^C 时,tty 驱动程序会将 SIGINT 发送到前台进程组中的所有进程。信号来自系统,而不是来自另一个进程,因此与一个进程向另一个进程发送信号相关的权限检查不适用。
推荐阅读
- google-cloud-platform - Google iot MQTT - ESP32 第一次连接,仅在 30m 后重新连接
- swift - 上传个人资料图片。无法将从库中挑选的照片分配给用户节点中的 profilepic
- java - 如何使用 DatePickerSkin 在 Java 中缩放 datePicker
- python - discord.py - 没有 DM 发送给用户
- github-graphql - 如何使用 Github GraphQL.NET 获取 repo 的问题列表
- javascript - 如何将对象数组映射到 React 中的不同组件道具?
- r - R Shiny:有条件地要求用户选择pickerInput
- reactjs - 如何使用 reactjs 实现模态
- python-3.x - 如何在另一帧中打印我在一帧中拍摄的条目
- r - 删除数据框中的“\N”值