Как реализовать драйвер Erlang как эффективную реализацию по умолчанию

В системе времени выполнения Erlang (ERTS) есть несколько драйверов, написанных на языке C, которые используются для взаимодействия с ОС или для доступа к низкоуровневым ресурсам. Насколько мне известно, ERTS компилирует эти драйверы во время загрузки, чтобы подготовиться к загрузке из кода Erlang. , драйвер является одним из этих драйверов, и он используется для обработки сетевых задач, таких как создание сокетов и прослушивание или прием новых входящих подключений.

Я хотел протестировать этот драйвер вручную, чтобы получить общее представление о поведении ERTS по умолчанию и знать, как эффективно внедрять драйверы в будущем, я отслеживал руководство по Erlang, чтобы реализовать драйверы, в которых говорилось: сначала напишите и скомпилируйте драйвер с помощью компилятор языка C OS, второй загрузите драйвер из кода Erlang, используя модуль, наконец, связать с драйвером порожденным процессом Erlang, так что это очень просто и легко.

Итак, я попробовал эти шаги с драйвером , Я поискал его и попытался скомпилировать с помощью Clang Compiler, который является компилятором C по умолчанию для системы FreeBSD:

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

https://ibb.co/bbtFHZ7

https://ibb.co/sF8QsDx

https://ibb.co/Lh9cDCH

https://ibb.co/W5Gcj7g

1 ответ

Перво-наперво:

Насколько мне известно, ERTS компилирует эти драйверы во время загрузки.

Нет, ERTS не компилирует драйверы. компилируется как часть Erlang/OTP и подключается к двоичный.

не типичный водитель. Цитирование раздела документации « Как реализовать драйвер »:

Драйвер может загружаться динамически в виде разделяемой библиотеки (известной как 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, но принцип остается прежним — в большинстве случаев вы захотите просто запустить компилятор, а не вызывать его напрямую, но если вам нужно вызвать компилятор, это будет намного сложнее. легче начать с командной строки, которая создан для вас.

Другие вопросы по тегам