在 Linux 上使用提升的权限终止进程 运行 时套接字锁定
Socket locks up when killing a process ran with elevated permissions on Linux
我 运行 遇到了一个问题,我想了解更多。
我在 Linux 机器上有一个 C++ 应用程序。我们称之为 program1
。 program1
使用 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
检查实际上是哪个系统调用失败,从而找到真正的罪魁祸首。
我 运行 遇到了一个问题,我想了解更多。
我在 Linux 机器上有一个 C++ 应用程序。我们称之为 program1
。 program1
使用 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
检查实际上是哪个系统调用失败,从而找到真正的罪魁祸首。