【问题标题】:Which platforms implement flock?哪些平台实现了flock?
【发布时间】:2014-07-23 11:55:09
【问题描述】:

我正在查看File#flock 的 Ruby MRI 代码。该文档指出它“并非在所有平台上都可用。”,但没有说明是哪一个。如果我冒昧地猜测一下,旧的 FAT 文件系统可能没有锁定,但我不想猜测。

深入了解实现会将我带到rb_file_flock(VALUE obj, VALUE operation),而后者又调用rb_thread_flock(void *data)。这只是包装了从sys/file.hflock 的调用。但是,似乎此实现可能可用也可能不可用:

#ifdef HAVE_SYS_FILE_H
# include <sys/file.h>
#else
int flock(int, int);
#endif

但是,我不知道 HAVE_SYS_FILE_H 是在哪里定义的(也许是在构建脚本中?),所以我不知道哪些平台可以启用它。

所以,对于我的问题:我可以期望为哪些平台定义 HAVE_SYS_FILE_H。如果它定义并且sys/file.h可用,我可以期待文件锁定工作吗?

【问题讨论】:

  • 您是否要求枚举所有平台?包括游戏机和烤面包机?
  • 好吧,我不知道在哪里画线。我想我只对可以编译 Ruby 的平台感兴趣,但我不确定如何呈现这样的列表。实际上,我想像 osx、linux、*bsd、windows 和 solaris 这样的东西可以涵盖任何现实世界的案例,从这个页面来看:ruby-lang.org/en/installation

标签: c flock


【解决方案1】:

flock是一个BSD和Linux的扩展函数:

符合

4.4BSD(flock() 调用首次出现在 4.2BSD 中)。可能以 fcntl(2) 的形式实现的 flock() 版本出现在大多数 UNIX 系统上。

Unix 规范确实需要根据fcntl(F_SETLK) 实现咨询文件锁定:

常规文件支持记录锁定,其他文件可能支持。

【讨论】:

  • 谢谢 - 所以这将涵盖所有的 unices,我想 - 包括 bsd 和 osx?但这会将窗户留在哪里?
  • 您可以使用 autoconf 来确定该功能是否可用。 stackoverflow.com/a/15606859/412080
  • 是的,但我的问题是倒退的——我需要知道 ruby​​ mri 是如何做到的。除非你说他们使用 autoconf?
  • OK - 我看到在 github.com/ruby/ruby/blob/trunk/configure.in 中提到了两次羊群,但我真的很想解释这个文件。 ac 如何从中获得并定义一个常量HAVE_SYS_FILE_H?或者真的 - 哪些平台会发生这种情况?
  • @troelskn 我希望我能用三句话向你解释autoconf...查看它的文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
相关资源
最近更新 更多