Страницы 1
Давайте попробуем рассмотреть нетрадиционную для холивара «винда-линь» тематику собственно написания ПО.
Линуксоиды часто любят хвастать подробнейшей документацией по программированию под Линукс и тыкать в различные слухи о "недокументированных" возможностях винды, которые якобы бьются от версии к версии. Так ли это?
Возьмём простой пример, можно сказать, упрощённый. Писал я недавно кросплатформенный (win32 + win64 + winCE + GNU) класс для простой работы с файловым I/O. Ну там, открыть, закрыть, получить размер, прочитать блок, записать блок. В зависимости от дефайнов оно компилировалось с виндовым API или с libc. Для виндов вся релевантная документация аккуратно собрана в одном месте в MSDN Library. В линуксе же надо было вспомнить (потому что центрального портала по API нет и не предвидится), что функция называется fopen(), прочитать ман, обнаружить что она не подходит, потому что не возвращает дескриптор файла, посмотреть "See Also", найти open(), посмотреть у него "See Also" и перебором манов всех упомянутых функций найти нужные. Особенно озадачило название функции для получения размера файла -- stat(). Попутно выяснилось, что, например, когда fopen() возвращает указатель, fclose() его закрывает, а open() дескриптор, close() закрывает, следует ли ожидать, что функции на f работают без дескрипторов? Но нет. Функция stat() берёт имя файла, а fstat() - дескриптор. Нелогично! А ещё какой-то сумрачный гений додумался для 64-битных платформ делать отдельные прототипы и экспорты! Т.е. функция fstat() это не тоже самое, что функция fstat64(), не говоря уже о том, что libc, оказывается, не экспортирует ни тот ни другой символ! А экспортирует она __fxstat и __fxstat64, которые, разумеется, в манах не описаны вобще и их надо вызывать с другими параметрами, добавляя макрос версии либса.
Более того, как оказалось, в файловом API libc'а принципиально отсутствуют многие стандартные виндовые фишки. Например, флаги диспозиции типа OPEN_ALWAYS или TRUNCATE_EXISTING; также не совсем понятно как разграничить доступ к файлу из других контекстов — в виндах можно, например открыть файл с GENERIC_WRITE а разделить с FILE_SHARE_READ, а можно и наоборот (GENERIC_READ + FILE_SHARE_WRITE); так же там не оказалось overlapped IO и флагов оптимизации кэширования. В целом, неприятное впечатление осталось. Всё то, чем я привык пользоваться в виндах при написании программ, пришлось урезать и кастрировать, чтобы это можно было портировать под линукс.
Теперь вопрос, может я что-то пропустил и где-то в дебрях GNU есть какая-то секретная библиотека, которая всё это умеет?
Ignorance more frequently begets confidence than does knowledge.
Неактивен
умение искать — полезная вещь.
Ничего такого, чего я не знаю, там нет.
Вопрос о логичности названий функций, об уродских именах экспорта и о невозможности задать нужные режимы файлшаринга при открытии -- остался открытым.
Ignorance more frequently begets confidence than does knowledge.
Неактивен
Более того, как оказалось, в файловом API libc'а принципиально отсутствуют многие стандартные виндовые фишки. Например, флаги диспозиции типа OPEN_ALWAYS или TRUNCATE_EXISTING
Вопиющая дезинформация ?! Могу ошибаться, но из источника http://linux.die.net/man/3/open:
OPEN_ALWAYS ---> O_CREAT
TRUNCATE_EXISTING ---> O_TRUNC
Удаление аватары должно работать 100%
Неактивен
также не совсем понятно как разграничить доступ к файлу из других контекстов — в виндах можно, например открыть файл с GENERIC_WRITE а разделить с FILE_SHARE_READ, а можно и наоборот (GENERIC_READ + FILE_SHARE_WRITE);
Скорее всего, google меня любит ( тупо поискал linux FILE_SHARE_READ ):
http://www.linuxforums.org/forum/linux- … linux.html
Откуда переходим к fcntl...
P.S. Вообще бы посоветовал купить книгу по основам программирования для linux. Сам, к примеру, читаю Майкл К. Джонсон, Эрик В. Троан. "Разработка приложений в среде Linux".
http://www.ozon.ru/context/detail/id/3261770/
Редактировался ont (28-05-10 19:13:47)
Удаление аватары должно работать 100%
Неактивен
ман по функции open присутствует во всех уважающих себя дистрибутивах. приведу сетевой вариант.
Я читал этот ман. И именно вдумичвый поиск того, что похоже на виндовые возможности, и повергает в уныние.
и вообще. это даже уже не вопрос, а утверждение, чёрт возьми. порождённое, по видимости, неумением читать.
А давай ты, умеющий читать, расскажешь, с какими параметрами надо вызвать open(), чтобы получилось строго следующее:
CreateFile(FullPathName,GENERIC_READ,FILE_SHARE_WRITE,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING,0);
И заодно расскажи, как портировать под Линукс Overlapped I/O.
stdio.h, однако, рулит.
C\C++, однако, не единственный язык программирования. И в данном конкретном случае (см. третий абзац заглавного поста) не подходит просто по отсутствию инструментария — нет таких компиляторов C\C++, которые из одного и того же исходника сгенерировали бы бинарник под вин32, вин64, винЦЕ и гну. Увы.
Вопиющая дезинформация ?! Могу ошибаться, но из источника http://linux.die.net/man/3/open:
OPEN_ALWAYS ---> O_CREAT
TRUNCATE_EXISTING ---> O_TRUNC
А как быть с остальными диспозициями? CREATE_NEW, CREATE_ALWAYS, OPEN_EXISTING ? Я прекрасно знаю, что можно написать обвязку, которая проверяет наличие файла и что-то там делает в зависимости от этого. Но прелесть CreateFile() в том что это атомарная операция ФС. И никто другой не успеет создать файл между проверкой его на несуществование и пересозданием. А вот в линуксе - увы и ах.
Редактировался MouseTail (28-05-10 19:31:26)
Ignorance more frequently begets confidence than does knowledge.
Неактивен
А как быть с остальными диспозициями? CREATE_NEW, CREATE_ALWAYS, OPEN_EXISTING ?
Ну давайте, попробую провести разминку для своих мозгов (если будет нужно, то можно и реальный код привести):
CREATE_NEW ---> O_CREAT | O_EXCL (если файл уже существовал, то будет ошибка)
CREATE_ALWAYS ---> O_CREAT | O_TRUNC
OPEN_EXISTING ---> тут просто не нужно добавлять опцию O_CREAT и, если файла нет, то будет ошибка.
Редактировался ont (28-05-10 20:28:43)
Удаление аватары должно работать 100%
Неактивен
Майор Очевидность, 5+, только для CREATE_ALWAYS нужно было еще добавить O_TRUNC.
MouseTail, у меня глупый вопрос Для чего такой файл:
CreateFile(FullPathName,GENERIC_READ,FILE_SHARE_WRITE,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING,0);
Как бы я это перевел: создаю файл, сам только читаю, остальным разрешаю писать и писать нужно без задержек на диск. Очень странно. Общение с другими программами через файл (это мое наивное предположение) ? И язык программирования Delphi ?
Удаление аватары должно работать 100%
Неактивен
Как бы я это перевел: создаю файл, сам только читаю, остальным разрешаю писать и писать нужно без задержек на диск. Очень странно. Общение с другими программами через файл (это мое наивное предположение) ? И язык программирования Delphi ?
В оригинальном тексте там другие флаги, а этот пример - сферический в вакууме.
Язык Delphi, компилер FPC.
Ignorance more frequently begets confidence than does knowledge.
Неактивен
Страницы 1