当杀死在Linux上具有较高权限的运行进程时,套接字会锁定

时间:2018-12-03 04:57:00

标签: c++ linux sockets ipc zeromq

我遇到了一个我想了解更多的问题。

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

但是,如果我以提升的权限运行program1

$ sudo ./program1

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

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

那是标记吗?如果是这样,是否有办法防止代码中出现这种类型的问题,或者在不重新启动整个计算机的情况下解决此问题?

更新了******

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

1)当我点击Ctr + C时,该软件确实退出了。即使以sudo运行,也无法在系统监视器中找到它。 (sudo gnome-system-monitor)

2)套接字在创建时返回“地址已在使用中”。

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

1 个答案:

答案 0 :(得分:2)

您说的是:“ IPC套接字”。

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

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

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

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