繁体   English   中英

在应用程序崩溃时未删除Unix域套接字文件

[英]Unix domain socket file not removed on application crash

我有一个Linux C ++应用程序,该应用程序通过Unix Domain Socket生成并与另一个进程交互。 这个新进程基本上只在任务栏中显示当前正在运行的进程的图标,并在该图标中显示一些菜单项。

问题:正常关闭主应用程序后,将删除UDS文件。 但是,如果应用程序崩溃,则不会删除此UDS文件,并且该文件会持续存在。

有什么方法可以在应用程序崩溃时通过编码删除UDS文件?

有什么方法可以在应用程序崩溃时通过编码删除UDS文件?

是。 有几种方法取决于您使用潜在的非便携式功能的能力。

使用单独的过程:

使用单独的过程来监视您的应用程序; 也许是您为此目的而写的。 当此监视过程检测到您的应用程序已结束时,它将检查Unix域套接字文件。 如果找到,它将删除它。 然后重新启动应用程序(如果需要)。

使用“抽象套接字”:

我相信您也可以使用“抽象套接字”,尽管我自己还没有尝试过。

用于Unix域套接字的在线linux手册页描述了称为“抽象套接字”的扩展。 它解释说:“当关闭所有对套接字的打开的引用时,抽象套接字会自动消失。”

使用“封闭式语义”:

基于Linux的Unix域套接字手册页的注释部分声称:“通常的UNIX封闭式语义适用;该套接字可以随时取消链接,并且在最后一次关闭对它的引用时,它将最终从文件系统中删除”。 即调用bind来创建套接字,等到客户端连接后,再unlink套接字的unlink ,然后处理可能会崩溃的代码。 但是,一旦从目录条目中删除套接字,新的客户端连接尝试将失败。

使用潜在的解决方法

bind调用之前,请在套接字上使用SO_REUSEADDR 这可能允许应用程序重新启动而无需删除套接字。 我不知道这种行为是否为Unix套接字定义得很好。 它可能在一个平台上运行,但在另一个平台上不运行。

问题:正常关闭主应用程序后,将删除UDS文件。 但是,如果应用程序崩溃,则不会删除此UDS文件,并且该文件会持续存在。

处理Unix域套接字文件(它的可移植/标准版本)的另一种方法是在创建应用程序之前删除应用程序中的套接字文件。 因此,在您的应用程序调用bind之前,它将使用unlink 只要这是创建此文件的唯一过程,就应该避免发生种族冲突。

但是请注意,如果您的应用程序以更高的特权运行(例如,使用set-user-ID功能以root身份运行),则使用unlink可能会打开潜在的安全漏洞。 然后,请确保用户无法告诉应用程序用于套接字的路径,并且该套接字所在的目录都不能由用户修改。 否则,用户可以告诉应用程序套接字的完整路径类似于/etc/passwd然后运行它以删除该文件,即使他们自己的用户没有权限执行该操作。

当然,可以通过使用最少特权帐户来获得设置用户ID特权或一起避免设置用户ID来减轻这种损坏的可能性。 另一个缓解措施是不允许用户指示应用程序为其套接字使用什么路径-可能仅使用硬编码的路径名,而该用户对该用户的任何目录都没有写权限,这可能是一个缓解方法。

不确定是否有帮助,但是您可以检测到孤立的unix套接字。

您可以尝试在启动时锁定文件或套接字。 如果锁定成功,则意味着该套接字是孤立的并且可以删除。 这是因为由于任何原因终止进程时,操作系统都会释放文件锁。

或者, bind到该unix套接字。 仅当套接字名称未使用时, bind才会成功。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM