Какие платформы реализуют стаю?

Я просматриваю код Ruby MRI для File#flock. В документации указано, что он «доступен не на всех платформах», но не указано, на каких. Если я рискну предположить, старые файловые системы FAT могут не иметь блокировки, но я бы не хотел строить догадки.

Немного покопавшись в реализации, я перешел к rb_file_flock(VALUE obj, VALUE operation), который, в свою очередь, вызывает rb_thread_flock(void *data). Это просто перенос вызова flock из sys/file.h. Однако кажется, что эта реализация может быть доступна, а может и не быть:

#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 доступен, могу ли я ожидать, что блокировка файлов будет работать?


person troelskn    schedule 03.06.2014    source источник
comment
Вы запрашиваете перечисление всех платформ? Включая геймбои и тостеры?   -  person Kerrek SB    schedule 03.06.2014
comment
Ну, я не уверен, где провести черту. Полагаю, меня интересуют только платформы, для которых можно скомпилировать Ruby, но я не уверен, как представить такой список. На самом деле, я полагаю, что что-то вроде osx, linux, *bsd, windows и solaris подойдет для любых реальных случаев, судя по этой странице: ruby-lang.org/en/installation   -  person troelskn    schedule 03.06.2014


Ответы (1)


flock — это функция расширения BSD и Linux:

В СООТВЕТСТВИИ С

4.4BSD (вызов flock() впервые появился в 4.2BSD). Версия flock(), возможно, реализованная в терминах fcntl(2), присутствует в большинстве систем UNIX.

Спецификация Unix требует реализации рекомендуемой блокировки файлов с точки зрения fcntl(F_SETLK):

Блокировка записи должна поддерживаться для обычных файлов и может поддерживаться для других файлов.

person Maxim Egorushkin    schedule 03.06.2014
comment
Спасибо. Так что, я полагаю, это будет охватывать все unices, включая bsd и osx? Но где остаются окна? - person troelskn; 03.06.2014
comment
Вы можете использовать autoconf, чтобы узнать, доступна ли функция. stackoverflow.com/a/15606859/412080 - person Maxim Egorushkin; 03.06.2014
comment
Да, но мой вопрос задом наперед - мне нужно знать, как это делает ruby ​​mri. Если вы не говорите, что они используют autoconf? - person troelskn; 03.06.2014
comment
ОК - я вижу, что flock дважды упоминается в github.com/ruby/ruby/blob/ trunk/configure.in, но я действительно глубоко запутался в интерпретации этого файла. Как ac переходит от этого к определению константы HAVE_SYS_FILE_H? Или действительно — для каких платформ это произойдет? - person troelskn; 03.06.2014
comment
@troelskn Хотел бы я объяснить вам autoconf в трех предложениях... Ознакомьтесь с его документацией. - person Maxim Egorushkin; 03.06.2014
comment
Да, я думаю, что мы приближаемся к моей настоящей проблеме: P - person troelskn; 03.06.2014
comment
@troelskn Вы можете скачать исходники, запустить ./configure и затем проверить config.log. Там вы можете найти исходники программы на C, которую она компилирует и запускает, чтобы определить, доступен ли flock. - person Maxim Egorushkin; 03.06.2014