【问题标题】:POSIX open() hangs on SMB sharePOSIX open() 在 SMB 共享上挂起
【发布时间】:2020-09-28 17:54:03
【问题描述】:

我在使用mount.cifs 在 linux 下挂载 Windows SMB 共享并从我的 C++ 程序写入文件时遇到问题。这工作正常,但一旦出现网络问题(即 Windows 服务器断开连接),使用 POSIX open() 打开文件将无限期挂起。如果在文件打开时共享断开连接,POSIX close() 调用也会发生同样的情况。使用std::ofstream 会发现类似的问题。

有吗

  • 另一个版本的open() / close() 在超时后返回?
  • 一种从另一个线程释放打开调用而不杀死试图打开的线程的方法?
  • 一种预先测试呼叫是否会挂起的方法?

【问题讨论】:

  • 那么您需要 POSIX(便携式)还是仅限 Linux 的解决方案? Linux 上有一个新的io_uring 系统调用,可以异步打开/关闭。它不会打断任何东西,但至少不会阻塞。不知道这是否会是你……
  • @StaceyGirl 谢谢,但目标平台是内核 4.14 上的 Raspbian,所以io_uring 不是一个选项。

标签: c++ linux posix smb


【解决方案1】:

系统调用在信号到达时被中断; errno 将返回 EINTR。

您可以在系统调用之前使用alarm() 在超时时间之后安排 SIGALRM。

如果系统调用在超时期限到期之前成功返回,您还可以使用alarm() 取消挂起的 SIGARLM。

【讨论】:

  • 我试过了。它确实停止了阻塞,但也终止了我的应用程序。有没有办法避免这种情况?
  • 也许setitimer()timer_create() 可用于亚秒级超时。
  • 你注册了一个信号处理器吗?如果不处理或忽略,某些信号具有终止程序的默认操作。
  • 好吧,这就回答了这个问题!谢谢。
  • 我想补充一点:信号确实会中断,是的,但在某些情况下不会立即中断:open() 调用会立即中断,但close() 在我的实验中需要 189 秒。这样的进程甚至不能被 SIGKILL 立即中断,见this answeruninterruptable sleep
猜你喜欢
  • 2021-05-24
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 2015-03-15
  • 2018-04-10
  • 2010-12-24
  • 2019-02-18
  • 2016-09-23
相关资源
最近更新 更多