【发布时间】:2018-07-21 11:04:27
【问题描述】:
我正在使用 keybase(您的 SSH 和其他密钥的云基础数据存储),但今天我启动 X-Windows 时它没有重新启动。
因此,命令df(以及我的代码中的statvfs())在告诉我传输已关闭后会阻塞。
$ df
df: '/home/alexis/"/home/alexis/.local/share/keybase/fs"': Transport endpoint is not connected
df: /run/user/1000/gvfs: Transport endpoint is not connected
_
提示会坐在那里,永远不会回来。
我不太在意df 目前会卡住,但我想知道我应该如何更新我的 C++ 代码来处理statvfs() 在我的应用程序中阻塞的情况,因为那是不可接受的。我只是看不到在不使用信号的情况下中断该呼叫的方法(想到 SIGALRM)。
有没有更好的方法来处理这种情况?
(注意:我的代码是用 C++ 编写的,尽管 C 解决方案应该可以正常工作并且可能是所需的,因此使用两种语言进行标记。)
【问题讨论】:
-
您的应用程序是单线程的吗?您必须安装您的
SIGALARM处理程序而不使用默认的SA_RESTART,如果您在整个应用程序中这样做,可能会有很多其他代码会中断。而且,如果您是多线程的,则无论如何您都可能会破坏其他线程。 -
@AndrewHenle 它是单线程的。确保它不会到处损坏的最简单方法......这也是一个短暂的 fork()-ed 过程。我想
SA_RESTART会重新启动statvfs()... 从而继续阻塞。嗯... -
如果你的进程是单线程的,只需使用
sigaction()为SIGALARM安装一个信号处理程序没有SA_RESTART标志,所以警报会导致@ 987654333@ 失败,errno设置为EINTR。
标签: c++ c networking disk