В тексте запроса используется английский язык.
Вот перевод текста на русский язык:
Таблицы можно изменять и добавлять IP-адреса, аналогично для маршрутов. Существует также необработанный интерфейс netlink, и вы можете создавать новые интерфейсы. Существует гораздо больше функциональности, которую netlink должен предоставить, но сейчас это в основном вопрос конфигурации. API всё ещё нуждается в доработке. Документация по netlink довольно плохая. Полезные ресурсы: пост в блоге.
Также существует множество интерфейсов ioctl, которые очень разнообразны. В основном вам просто нужны некоторые константы и приведение типов, но вспомогательные функции, вероятно, полезны.
Цель состоит в том, чтобы обеспечить удобные в использовании интерфейсы, дружественные к Lua, где это возможно, но необходимо проделать дополнительную работу, поскольку мы действительно начали с необработанных интерфейсов, но добавляем функциональность через метатипы. Где это возможно, цель состоит в том, чтобы предоставить кроссплатформенные интерфейсы для более высокоуровневой функциональности, которые максимально близки, по крайней мере, в смысле утиной типизации.
Многие системные вызовы имеют оболочки glibc, некоторые из них тривиальны, а некоторые — нет, а некоторые сломаны. В частности, некоторые из них раскрывают разные ABI, поэтому мы стараемся избегать их, просто используя ABI ядра, поскольку они имеют долгосрочную поддержку, и мы не пытаемся быть совместимыми, так как используем другой язык. strace
— ваш друг, хотя strace глючит в неприятных крайних случаях (в какой-то момент ljsyscall реализует ptrace, чтобы он мог отлаживать себя).
Помимо eglibc и glibc, теперь всё работает на Musl libc. Я использую sabotage в качестве среды сборки, которая теперь включает luajit, хотя вам может потребоваться обновить её до git head. Musl намного меньше, чем libc (700k против 3M), но при этом реализует всё, что нам нужно, в простом для понимания коде. Он также лицензирован MIT, что может быть полезно, поскольку соответствует другим лицензиям для LuaJIT и ljsyscall. Время от времени я нахожу небольшие ошибки и недостающие функции, о которых сообщаю разработчикам.
Все функции возвращают два значения: возвращаемое значение или true, если нет другого, кроме успеха, затем значение ошибки. Это упрощает написание таких вещей, как assert(fd:close())
. Тип ошибки можно преобразовать в строковое сообщение, или вы можете получить errno, или сравнить с символическим именем ошибки.
Дескрипторы файлов возвращаются как тип, а не целое число. Это потому, что они по умолчанию собираются сборщиком мусора, то есть если они выходят за пределы области видимости, файл закрывается. Вы можете получить дескриптор файла, используя поле fileno. Чтобы отключить сборку мусора, вы можете вызвать fd:nogc()
, в этом случае вам нужно закрыть дескрипторы вручную. У них также есть методы для операций, требующих fd, таких как close
, fsync
, read
. Вы можете использовать этот тип там, где требуется fd, или числовое значение fd, или строка вроде «stderr».
Преобразования строк не выполняются автоматически, вы получаете буфер обратно, вы должны принудительно выполнить преобразование. Это связано с тем, что интернирование строк обходится дорого, если оно вам не нужно. Однако если вы не предоставите буфер для возвращаемого значения, вы получите строку в целом, что более полезно.
Многие функции, возвращающие структуры, возвращают метатипы, предоставляющие дополнительные методы, поэтому вы получаете необработанные значения, например st_size
, и число Lua в виде size
, а также, возможно, некоторые дополнительные полезные методы. Поскольку это метаметоды (ffi), они не требуют дополнительных затрат, поэтому можно добавить больше, чтобы упростить использование интерфейсов.
Должны быть доступны все константы, например, c.SEEK.SET
и т. д., обратите внимание, что они помещены в таблицы Lua вместо разделения подчёркиванием, как в C. Таблицы констант также позволят вам комбинировать флаги там, где это уместно, и вы можете использовать нижний регистр, поэтому c.O["rdonly, create"]
совпадает с побитовым или c.O.RDONLY
и c.O.CREAT
. Когда вы вызываете функцию, вы можете просто передать строку, например, fd = S.open("file", "rdonly, creat")
, что делает вещи более краткими.
Вам обычно не нужно использовать пронумерованные версии функций, например dup может выполнять dup2 или dup3, добавляя больше аргументов (не полностью согласован).
Типы важны, поскольку они заключают в себе много информации.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )