Как реализовать драйвер Erlang как эффективную реализацию по умолчанию
В системе времени выполнения Erlang (ERTS) есть несколько драйверов, написанных на языке C, которые используются для взаимодействия с ОС или для доступа к низкоуровневым ресурсам. Насколько мне известно, ERTS компилирует эти драйверы во время загрузки, чтобы подготовиться к загрузке из кода Erlang. , драйвер является одним из этих драйверов, и он используется для обработки сетевых задач, таких как создание сокетов и прослушивание или прием новых входящих подключений.
Я хотел протестировать этот драйвер вручную, чтобы получить общее представление о поведении ERTS по умолчанию и знать, как эффективно внедрять драйверы в будущем, я отслеживал руководство по Erlang, чтобы реализовать драйверы, в которых говорилось: сначала напишите и скомпилируйте драйвер с помощью компилятор языка C OS, второй загрузите драйвер из кода Erlang, используя
Итак, я попробовал эти шаги с драйвером
cc inet_drv.c
после этого возникла ошибка о том, что файл
cc inet_drv.c -I/usr/ports....
после этого был еще один неопределенный файл, поэтому я проделал то же самое 5 или 6 раз и, наконец, я добавил все необходимые пути для включенных файлов, и в результате получилась следующая команда:
cc inet_drv.c
-I/usr/ports/lang/erlang/work/otp-OTP-21.3.8.18/erts/emulator/beam
-I/usr/local/lib/erlang/usr/include
-I/usr/ports/lang/erlang/work/otp-OTP-21.3.8.18/erts/emulator/sys/unix
-I/usr/ports/lang/erlang/work/otp-OTP-21.3.8.18/erts/include/internal
-I/usr/ports/lang/erlang/work/otp-OTP-21.3.8.18/erts/emulator/sys/common
-I/usr/ports/lang/erlang/work/stage/usr/local/lib/erlang/erts-10.3.5.14/include/internal
Результат меня удивил:13 ошибок и 7 предупреждений, вывод оболочки и описание ошибок и предупреждений по ссылкам ниже. У меня вопрос: почему возникают эти ошибки? Что плохого в том, что я сделал?
Поскольку этот драйвер отлично работает в ответ на сетевые задачи ERTS, он скомпилирован ERTS без ошибок, и ERTS должен использовать компилятор языка C OS, который по умолчанию является Clang и должен добавлять включенные файлы заголовков, как и я, так почему это произошло? не работает когда я пытался сделать?
1 ответ
Перво-наперво:
Насколько мне известно, ERTS компилирует эти драйверы во время загрузки.
Нет, ERTS не компилирует драйверы.
не типичный водитель. Цитирование раздела документации « Как реализовать драйвер »:
Драйвер может загружаться динамически в виде разделяемой библиотеки (известной как DLL в Windows) или загружаться статически и связываться с эмулятором при его компиляции и компоновке. Здесь описываются только динамически загружаемые драйверы, статическая компоновка драйверов выходит за рамки этого раздела.
является статически загруженным драйвером, и поэтому его не нужно загружать с помощью
К ошибкам компиляции. Все параметры компилятора автоматически добавляются для вас при запуске, поэтому, если вам нужно вызвать компилятор вручную, лучше просто проверьте сгенерированную командную строку и начните с нее. Давайте посмотрим на журнал сборки для пакета Debian Erlang . Searching for
x86_64-linux-gnu-gcc -Werror=undef -Werror=implicit -Werror=return-type -fno-common \
-g -O2 -fno-strict-aliasing -I/<<PKGBUILDDIR>>/erts/x86_64-pc-linux-gnu -D_GNU_SOURCE \
-DHAVE_CONFIG_H -Wall -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes \
-Wdeclaration-after-statement -DUSE_THREADS -D_THREAD_SAFE -D_REENTRANT -DPOSIX_THREADS \
-D_POSIX_THREAD_SAFE_FUNCTIONS -DBEAMASM=1 -DLIBSCTP=libsctp.so.1 \
-Ix86_64-pc-linux-gnu/opt/jit -Ibeam -Isys/unix -Isys/common -Ix86_64-pc-linux-gnu \
-Ipcre -I../include -I../include/x86_64-pc-linux-gnu -I../include/internal \
-I../include/internal/x86_64-pc-linux-gnu -Ibeam/jit -Ibeam/jit/x86 -Idrivers/common \
-Idrivers/unix -c \
drivers/common/inet_drv.c -o obj/x86_64-pc-linux-gnu/opt/jit/inet_drv.o
Некоторые из них будут отличаться, так как вы строите на FreeBSD, но принцип остается прежним — в большинстве случаев вы захотите просто запустить компилятор, а не вызывать его напрямую, но если вам нужно вызвать компилятор, это будет намного сложнее. легче начать с командной строки, которая