我遇到了一个我想了解更多的问题。
我在Linux机器上有一个C ++应用程序。我们称之为program1
。 program1
使用ZeroMQ进行IPC通信。我认为ZeroMQ层与行为有关,但想介绍所有事实。如果我在没有提升权限的情况下通过终端运行program1
,则可以杀死它多次。我也可以毫无问题地在Eclipse上运行program1
。
但是,如果我以提升的权限运行program1
:
$ sudo ./program1
并杀死它(Ctrl + C),IPC套接字将锁定,并且在尝试在没有提升特权的情况下运行应用程序时将不可用。但是,如果我以提升的权限重新运行该程序,它就可以正常工作。
我的理论是,一旦以提升的权限运行应用程序,文件描述符就会将所有权更改为父进程(拥有提升的权限)。然后,当您终止进程时,永远不会正确清除文件描述符,因此它们的权限将被提升,没有提升的权限就无法使用。
那是标记吗?如果是这样,是否有办法防止代码中出现这种类型的问题,或者在不重新启动整个计算机的情况下解决此问题?
更新了******
正在更新以添加更多信息:
1)当我点击Ctr + C时,该软件确实退出了。即使以sudo运行,也无法在系统监视器中找到它。 (sudo gnome-system-monitor)
2)套接字在创建时返回“地址已在使用中”。
3)理想情况下,无论它们如何运行,我都希望它们能够相互连接。这不是我在开发过程中考虑的问题,并且会承认我是Linux和IPC通信的新手。
答案 0 :(得分:2)
您说的是:“ IPC套接字”。
我猜那不是TCP套接字。如果zeromq以root用户身份创建System V IPC对象,则用户无法重用它,这就是权限错误的原因:IPC对象不会因进程死亡而被破坏,并具有用户所有权和权限。
您可以使用命令ipcs
列出现有IPC对象,并使用ipcrm
删除它们。
哦,是的-注意不要删除与您的工作无关的IPC对象...
如果我的猜测失败了,可以使用命令strace
检查哪个系统调用实际上未能找到真正的罪魁祸首。