在 Linux 上使用提升的权限终止进程 运行 时套接字锁定

Socket locks up when killing a process ran with elevated permissions on Linux

我 运行 遇到了一个问题,我想了解更多。

我在 Linux 机器上有一个 C++ 应用程序。我们称之为 program1program1 使用 ZeroMQ 进行 IPC 通信。我想 ZeroMQ 层与行为有一点关系,但想介绍所有事实。如果我 运行 program1 通过没有提升权限的终端,我可以多次杀死它。我也可以 运行 program1 使用 Eclipse 没有问题。

但是,如果我 运行 program1 具有提升的权限:

$ sudo ./program1

并杀死它 (Ctrl+C),IPC 套接字锁定并且在尝试 运行 没有提升权限的应用程序时无法使用。但是,如果我重新 运行 具有提升权限的程序,它就可以正常工作。

我的理论是,一旦您 运行 具有提升权限的应用程序,文件描述符就会将所有权更改为父进程(具有提升权限)。然后,当您终止进程时,文件描述符永远不会被正确清理,因此它们的权限被提升,没有提升的权限就无法使用。

标记上有吗?如果是这样,有没有办法在代码中防止此类问题,或者在问题发生后无需重新启动整个计算机即可解决问题?

已更新 ******

正在更新以添加更多信息:

1) 当我按下 Ctr+C 时,软件确实退出了。在系统监视器中找不到它,即使 运行 作为 sudo。 (sudo gnome-system-monitor)

2) 创建套接字 returns "address already in use"。

3) 理想情况下,我希望它们能够相互连接,无论它们如何 运行。这不是我在开发过程中考虑的问题,我承认我是 Linux 和 IPC 通信的新手。

你说的是:"the IPC socket".

我猜那不是 TCP 套接字。如果 zeromq 以 root 身份创建 System V IPC 对象,则用户无法重用它,这就是权限错误的原因:IPC 对象不会被进程死亡破坏,并且具有用户所有权和权限。

您可以使用命令 ipcs 列出现有的 IPC 对象,使用 ipcrm 删除它们。

哦,是的 - 注意不要删除与您的工作无关的 IPC 对象...

如果我猜错了,您可以使用命令strace检查实际上是哪个系统调用失败,从而找到真正的罪魁祸首。