【问题标题】:Non-blocking mount in LinuxLinux中的非阻塞挂载
【发布时间】:2009-01-28 02:29:03
【问题描述】:

我在单线程进程中使用 Linux 的 mount(2) 函数。但是像 CD-ROM 这样的设备的安装可能需要一段时间(我见过的最糟糕的是 40 秒!),因为它会考虑一点,启动磁盘,然后才会安装文件系统。这可能会在相当长的时间内阻止进程处理其他事件。

我似乎找不到以非阻塞方式挂载文件系统的方法。 有没有办法在不使用多线程或分叉的情况下异步挂载文件系统?

知道操作是否完成对我来说不是问题,因为我已经在同一个线程中读取了内核 uevent。

【问题讨论】:

  • 有什么特别的理由不分叉安装吗?
  • 我是一个完美主义者,希望保持单线程以尽可能少地使用资源。 :)
  • 我认为这是过早的优化。
  • 是的,但我确实没有编写分叉/线程代码,所以我宁愿避免这样做if 有一种简单的方法可以通过修改对 mount() 的调用来做我想做的事。问题是是否有任何(如用于 umount 的 MNT_DETACH)。答案很可能是“不”。
  • 这不是可能不。它不。

标签: c linux mount


【解决方案1】:

没有。在没有启动另一个线程或fork()ing 的情况下,您必须等待mount() 返回。

【讨论】:

  • 对...如果没有多线程或分叉,就无法异步执行任何操作。 (+1)
  • @David:嗯,有 AIO(异步 I/O - 在 Linux 上可能涉及启动一个线程,虽然我认为不会再启动了,如果有的话),但它没有挂载文件系统时没有帮助。但这是在狡辩——你的主要观点是准确的。
  • 很多事情可以异步完成,但我不认为 mount 是其中之一。
【解决方案2】:

如果您想以单线程方式执行此操作,您可以手动执行 mount 命令并将其置于后台并使用 select() 或其他方式轮询完成。但是,这有点骇人听闻,与在程序中分叉和调用 mount() 并没有太大区别。

另外值得注意的是,我经历过 mount() 阻塞整个进程(和相关线程),因此对于真正的异步行为,分叉可能是要走的路。

【讨论】:

    【解决方案3】:

    您可以让安装过程在后台运行。 运行类似的东西:

    system("mount -a ");
    

    system("mount -a &");
    

    这将使安装在后台为您完成。

    但是仔细看了一下,这个方案不是用C接口而是用系统接口

    【讨论】:

      猜你喜欢
      • 2014-11-17
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 2016-07-06
      相关资源
      最近更新 更多