微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bash如何使用CTRL + C

如何解决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设置setuid位。

以非特权用户身份从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的setuid位由root设置)。在这种情况下,父母不能杀死孩子。 kill调用返回-1,而test进程被孤立。

这是怎么回事? bash有什么特别之处,可以杀死它产生的子进程?

解决方法

Bash不需要任何权限,因为bash不会做任何事情。当您按^ C时,tty驱动程序会将SIGINT发送到前台进程组中的所有进程。该信号来自系统,而不是来自另一个进程,因此与向另一个进程发送信号的进程相关的权限检查不适用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。