应用程序崩溃时未删除Unix域套接字文件 我有一个Linux C++应用程序,它通过UNIX域套接字生成并与另一个进程交互。这个新进程基本上只是在任务栏中显示当前正在运行的进程的图标,图标中显示一些菜单项

应用程序崩溃时未删除Unix域套接字文件 我有一个Linux C++应用程序,它通过UNIX域套接字生成并与另一个进程交互。这个新进程基本上只是在任务栏中显示当前正在运行的进程的图标,图标中显示一些菜单项,c++,linux,ipc,unix-socket,C++,Linux,Ipc,Unix Socket,问题: 当主应用程序正常关闭时,UDS文件将被删除。 但在应用程序崩溃的情况下,此UDS文件不会被删除,并且会保留 有没有办法在应用程序通过编码崩溃时删除UDS文件 有没有办法在应用程序通过编码崩溃时删除UDS文件 对。有几种方法取决于您是否同意使用潜在的不可移植功能 使用单独的流程: 使用单独的流程来监控您的应用程序;也许你就是为了这个目的写的。当此监视进程检测到应用程序已结束时,它将检查Unix域套接字文件。如果找到,它将删除它。然后重新启动应用程序(如果需要) 使用“抽象套接字”: 我相信

问题: 当主应用程序正常关闭时,UDS文件将被删除。 但在应用程序崩溃的情况下,此UDS文件不会被删除,并且会保留

有没有办法在应用程序通过编码崩溃时删除UDS文件

有没有办法在应用程序通过编码崩溃时删除UDS文件

对。有几种方法取决于您是否同意使用潜在的不可移植功能

使用单独的流程:

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

使用“抽象套接字”:

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

一个在线描述称为“抽象套接字”的扩展。它解释道:“当所有打开的套接字引用都关闭时,抽象套接字自动消失。”

使用“紧跟语义”:

一个基于Linux的notes部分声称:“通常的UNIX close-behind语义适用;套接字可以在任何时候解除链接,并在最后一次引用关闭时最终从文件系统中删除”。也就是说,调用
bind
创建套接字,等待客户端连接,然后
unlink
套接字,然后继续执行可能崩溃的代码。但是,一旦从目录项中删除套接字,新的客户端连接尝试就会失败

使用潜在的解决方法

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

问题:当主应用程序正常关闭时,UDS文件将被删除。但在应用程序崩溃的情况下,此UDS文件不会被删除,并且会保留

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

请注意,如果应用程序以更高的权限运行(例如使用设置用户ID功能以root身份运行),则使用
取消链接可能会打开潜在的安全漏洞。然后确保用户不能告诉应用程序套接字使用的路径,并且用户不能修改套接字将驻留的目录。否则,用户可以告诉应用程序套接字的完整路径类似于
/etc/passwd
,并运行它删除该文件,即使用户自己没有这样做的权限

当然,这种潜在的损害可以通过使用特权最低的帐户来获得设置的用户ID权限,或者通过同时避免设置用户ID来减轻。另一种缓解措施是,不允许用户指示应用程序为其socket-like使用什么路径,可能只是使用硬编码的路径名,用户对其任何目录都没有写入权限

有没有办法在应用程序通过编码崩溃时删除UDS文件

对。有几种方法取决于您是否同意使用潜在的不可移植功能

使用单独的流程:

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

使用“抽象套接字”:

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

一个在线描述称为“抽象套接字”的扩展。它解释道:“当所有打开的套接字引用都关闭时,抽象套接字自动消失。”

使用“紧跟语义”:

一个基于Linux的notes部分声称:“通常的UNIX close-behind语义适用;套接字可以在任何时候解除链接,并在最后一次引用关闭时最终从文件系统中删除”。也就是说,调用
bind
创建套接字,等待客户端连接,然后
unlink
套接字,然后继续执行可能崩溃的代码。但是,一旦从目录项中删除套接字,新的客户端连接尝试就会失败

使用潜在的解决方法

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

问题:当主应用程序正常关闭时,UDS文件将被删除。但在应用程序崩溃的情况下,此UDS文件不会被删除,并且会保留

处理Unix域套接字文件(其可移植/标准版本)的另一种方法是在应用程序开始创建套接字文件之前删除它。