Видимая нелогичность API ? (Страница 1) / Программирование / Форум StopLinux

Объявление

Kwork.ru - услуги фрилансеров от 500 руб.

#1 28-05-10 11:31:50

MouseTail
Участник
Из Kiev
Зарегистрирован: 27-05-10
Сообщений: 49
Сайт

Видимая нелогичность API ?

Давайте попробуем рассмотреть нетрадиционную для холивара «винда-линь» тематику собственно написания ПО.

Линуксоиды часто любят хвастать подробнейшей документацией по программированию под Линукс и тыкать в различные слухи о "недокументированных" возможностях винды, которые якобы бьются от версии к версии. Так ли это?

Возьмём простой пример, можно сказать, упрощённый. Писал я недавно кросплатформенный (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.

Неактивен

#2 28-05-10 16:14:38

MouseTail
Участник
Из Kiev
Зарегистрирован: 27-05-10
Сообщений: 49
Сайт

Re: Видимая нелогичность API ?

Майор Очевидность пишет:

умение искать — полезная вещь.

Ничего такого, чего я не знаю, там нет.
Вопрос о логичности названий функций, об уродских именах экспорта и о невозможности задать нужные режимы файлшаринга при открытии -- остался открытым.


Ignorance more frequently begets confidence than does knowledge.

Неактивен

#3 28-05-10 18:46:22

ont
Участник
Зарегистрирован: 28-04-10
Сообщений: 57

Re: Видимая нелогичность API ?

MouseTail пишет:

Более того, как оказалось, в файловом API libc'а принципиально отсутствуют многие стандартные виндовые фишки. Например, флаги диспозиции типа OPEN_ALWAYS или TRUNCATE_EXISTING

Вопиющая дезинформация ?!  Могу ошибаться, но из источника https://linux.die.net/man/3/open:

OPEN_ALWAYS  --->   O_CREAT 
TRUNCATE_EXISTING --->  O_TRUNC

Удаление аватары должно работать 100% profile.php?action=delete_avatar&id=2

Неактивен

#4 28-05-10 19:05:16

ont
Участник
Зарегистрирован: 28-04-10
Сообщений: 57

Re: Видимая нелогичность API ?

MouseTail пишет:

также не совсем понятно как разграничить доступ к файлу из других контекстов — в виндах можно, например открыть файл с GENERIC_WRITE а разделить с FILE_SHARE_READ, а можно и наоборот (GENERIC_READ + FILE_SHARE_WRITE);

Скорее всего, google меня любит smile   ( тупо поискал linux FILE_SHARE_READ ):
https://www.linuxforums.org/forum/linux- … linux.html
Откуда переходим к fcntl...

P.S.  Вообще бы посоветовал купить книгу по основам программирования для linux. Сам, к примеру, читаю Майкл К. Джонсон, Эрик В. Троан. "Разработка приложений в среде Linux". 
https://www.ozon.ru/context/detail/id/3261770/

Редактировался ont (28-05-10 19:13:47)


Удаление аватары должно работать 100% profile.php?action=delete_avatar&id=2

Неактивен

#5 28-05-10 19:21:17

MouseTail
Участник
Из Kiev
Зарегистрирован: 27-05-10
Сообщений: 49
Сайт

Re: Видимая нелогичность API ?

Майор Очевидность пишет:

ман по функции 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, винЦЕ и гну. Увы.

ont пишет:

Вопиющая дезинформация ?!  Могу ошибаться, но из источника https://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.

Неактивен

#6 28-05-10 20:28:05

ont
Участник
Зарегистрирован: 28-04-10
Сообщений: 57

Re: Видимая нелогичность API ?

MouseTail пишет:

А как быть с остальными диспозициями? 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% profile.php?action=delete_avatar&id=2

Неактивен

#7 28-05-10 20:58:50

MouseTail
Участник
Из Kiev
Зарегистрирован: 27-05-10
Сообщений: 49
Сайт

Re: Видимая нелогичность API ?

Ладно-ладно, уели  lol  lol
А про overlapped есть что-нибудь?


Ignorance more frequently begets confidence than does knowledge.

Неактивен

#8 28-05-10 21:40:02

ont
Участник
Зарегистрирован: 28-04-10
Сообщений: 57

Re: Видимая нелогичность API ?

Майор Очевидность, 5+, только для CREATE_ALWAYS нужно было еще добавить O_TRUNC.
MouseTail, у меня глупый вопрос smile   Для чего такой файл:

CreateFile(FullPathName,GENERIC_READ,FILE_SHARE_WRITE,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING,0);

Как бы я это перевел: создаю файл, сам только читаю, остальным разрешаю писать и писать нужно без задержек на диск.  Очень странно. Общение с другими программами через файл (это мое наивное предположение) ?  И язык программирования Delphi ?


Удаление аватары должно работать 100% profile.php?action=delete_avatar&id=2

Неактивен

#9 28-05-10 22:11:21

MouseTail
Участник
Из Kiev
Зарегистрирован: 27-05-10
Сообщений: 49
Сайт

Re: Видимая нелогичность API ?

ont пишет:

Как бы я это перевел: создаю файл, сам только читаю, остальным разрешаю писать и писать нужно без задержек на диск.  Очень странно. Общение с другими программами через файл (это мое наивное предположение) ?  И язык программирования Delphi ?

В оригинальном тексте там другие флаги, а этот пример - сферический в вакууме.
Язык Delphi, компилер FPC.


Ignorance more frequently begets confidence than does knowledge.

Неактивен

Kwork.ru - услуги фрилансеров от 500 руб.
Мой VPS с 2016 года !
✅ Виртуальные от 300 ₽/месяц, RAM 1-10GB, DISK 20-360 GB;
✅ Выделенные от 3000 ₽/месяц. RAM 4-64GB, DISK до 4TB;
✅ Intel Xeon, SSD, XEN, iLO/KVM, Windows/Linux, Администрирование;
✅ Бесплатно Full Backup и Anti-DDoS.





Подвал форума

Под управлением FluxBB
Модифицировал Visman

Яндекс.Метрика