LINUX.ORG.RU

Избранные сообщения Vlad-76

В разработке игра, где программируешь в машинных кодах. DECU EMU

Форум — Development

Прочитав первые две главы Криса Касперского «Техника отладки программ без исходных кодов», я вдохновился на написание простого эмулятора, где мы как в старые времена пишем в hex редакторе опкоды инструкций.

Очень даже занимательный процесс, особенно учитывая, что инструкций всего 16 и их можно запомнить. Если проект не заглохнет и будет интересен мне и далее, то я сделаю сборку для android и аврора, где можно будет делать игры прямо вписывая машинные инструкции. Мне кажется, что такое уровень сложности должен кого-то привлечь.

Ну вот, с помощью мотивации я сделал себе два прекрасных дня, и теперь можно продолжить читать книгу.

https://habr.com/ru/articles/871634/

Перемещено hobbit из games

 

peeruoeso
()

Потянет ли Supermicro X8DTU Intel Xeon X5690

Форум — Linux-hardware

Столкнулся с вопросом. Есть сервак, на базе Supermicro X8DTU. На сайте производителя сказано, что он поддерживает процессоры: Xeon®Processor 5600 Series (Westmere). В данной линейки до процессоров Intel Xeon X5674 энергопотребление идет 90 ватт. Но вот есть в этой же линейки процессор Intel Xeon X5690, вот он уже потребляет до 120 ватт. На сайте производителя нет четкой информации по данному вопросу.
Есть у кого опыт использования данной метеринке в связке с данным процессором?

 

iliaxxx
()

Программирование древнего и экзотического big-endian ARM

Форум — Development

Нашёл в условном ящике стола мобильник Motorola SLVR L6, которому почти 20 лет. Протёр пыль, зарядил батарейку «лягушкой» – до сих пор рабочий чертяка. Оказалось, что под него можно кодить не только на унылом подмножестве Java – J2ME, но и на православной сишке и даже плюсцах. Скачал кросс-компилятор и SDK, доступные как под Linux, так и под Windows и решил написать пару GUI-программок и подёргать функции из прошивки телефона, но столкнулся с одной странной особенностью, про которую хочу уточнить у специалистов.

Есть у меня следующий минимально-неработающий пример и функция wtf_foo(), которую по хорошему нужно инлайнить, но похоже что в кросс-компиляторе вообще не работают инлайны:

#define SWAP_UINT32(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24))

static uint8_t bmp_header[70] = {
	0x42, 0x4D, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x38, 0x00,
	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00,
	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1F, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

static void wtf_foo(uint8_t *start_address, uint32_t start_offset, uint32_t value) {
	*((uint32_t *) &start_address[start_offset]) = value;
	/* start_address[start_offset + 0x00] = (value >>  0) & 0x000000FF; */
	/* start_address[start_offset + 0x01] = (value >>  8) & 0x000000FF; */
	/* start_address[start_offset + 0x02] = (value >> 16) & 0x000000FF; */
	/* start_address[start_offset + 0x03] = (value >> 24) & 0x000000FF; */
}

void main(void) {
	print_hex();
	wtf_foo(bmp_header, 0x02, SWAP_UINT32(41030));
	wtf_foo(bmp_header, 0x12, SWAP_UINT32(128));
	wtf_foo(bmp_header, 0x16, SWAP_UINT32(160));
	wtf_foo(bmp_header, 0x22, SWAP_UINT32(40960));
	print_hex();
}

Результаты исполнения кода:

42 4D |FF FF FF FF| 00 00 00 00 46 00 00 00 38 00
00 00 |FF FF FF FF FF FF FF FF| 01 00 10 00 03 00
00 00 |FF FF FF FF| 00 00 00 00 00 00 00 00 00 00         (1)
00 00 00 00 00 00 00 F8 00 00 E0 07 00 00 1F 00
00 00 00 00 00 00

42 4D |46 A0 00 00| 00 00 00 00 46 00 00 00 38 00
00 00 |80 00 00 00 A0 00 00 00| 01 00 10 00 03 00
00 00 |00 A0 00 00| 00 00 00 00 00 00 00 00 00 00         (2)
00 00 00 00 00 00 00 F8 00 00 E0 07 00 00 1F 00
00 00 00 00 00 00

|46 A0 00 00| FF FF 00 00 00 00 46 00 00 00 38 00 
|80 00 00 00 A0 00 00 00| FF FF 01 00 10 00 03 00 
|00 A0 00 00| FF FF 00 00 00 00 00 00 00 00 00 00         (3)
00 00 00 00 00 00 00 F8 00 00 E0 07 00 00 1F 00 
00 00 00 00 00 00
  1. Оригинальный массив без изменений.
  2. Результат работы кода на x86_64, little-endian, хост.
  3. Результат работы кода на ARMv4T, big-endian, целевая железка.

Примечание: Макрос SWAP_UINT32() используется только на целевом устройстве. Код функции wtf_foo() который закомментирован отрабатывает везде одинаково и нормально.

Не понимаю откуда тут берётся сдвиг влево, почему он именно на два байта? Хочется разобраться в чём именно причина этой ошибки? Где-то моя невнимательность при работе с ARM и big-endian или что-то другое, к примеру, баг в компиляторе?

Дополнительная информация, если кому интересно:

Компилятор:
     ARM C/C++ Compiler, ADS1.2 [Build 848]
     Thumb C/C++ Compiler, ADS1.2 [Build 848]
Железо:
     SOC: Freescale/Motorola Neptune LTE
     CPU: ARM7TDMI | ARMv4T | big-endian | 52 MHz
     RAM: (4) 8 MB, 1.5 MB free.
     DSP: 104 MHz StarCore DSP
Операционная система:
     P2K OS: Synergy Environment + VRTXmc RTOS Kernel.

P.S. Внутри девайса не Linux, но есть какой-то кастрированный libc и UNIX-подобная регистрозависимая файловая система.

 , , ,

EXL
()

Как в скрипте детектнуть - запустил его cron или запустили его с консоли?

Форум — Development

Можно аргумент скрипту передать при запуске cron ом. Может есть способ лучше?

 , ,

Vlad-76
()

journald. Запись на диск только критически важной информации

Форум — Admin

Т.е, чтобы текущий лог можно было прочитать(чтобы он в памяти находился) и только всякое критическое записывалось на диск. Зачем это? Потому что journald гигабайтами пишет информацию на диск, хотелось бы, чтобы он этого не делал

С 28 февраля

Data Units Read:                    4,093,715 [2.09 TB]
Data Units Written:                 1,066,151 [545 GB]

до 25 августа

Data Units Read:                    4,790,068 [2.45 TB]
Data Units Written:                 1,295,987 [663 GB]

118гб записано. Ясно, что тут не только лог писал, еще было 2 обновления. Но примерно 50% тут journald поработал. Идеологически считаю, что то, что пишет journald на диск - мусор. Хотелось бы какой-то level типа error выставить, чтобы он не спамил мусор на диск

 

serg002
()

Виртуалка с Debian 11. Как исправить ошибку с зависимостями в пакетах

Форум — Admin

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

root@acid:/usr/local/# apt install fail2ban
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
You might want to run 'apt --fix-broken install' to correct these.
The following packages have unmet dependencies:
 code : Depends: libasound2 (>= 1.0.17) but it is not going to be installed
        Depends: libatk-bridge2.0-0 (>= 2.5.3) but it is not going to be installed
        Depends: libatk1.0-0 (>= 2.2.0) but it is not going to be installed
        Depends: libatspi2.0-0 (>= 2.9.90) but it is not going to be installed
        Depends: libdrm2 (>= 2.4.75) but it is not going to be installed
        Depends: libgbm1 (>= 17.1.0~rc2) but it is not going to be installed
        Depends: libgtk-3-0 (>= 3.9.10) but it is not going to be installed
        Depends: libgtk-3-0 (>= 3.9.10) but it is not going to be installed or
                 libgtk-4-1 but it is not installable
        Depends: libnspr4 (>= 2:4.9-2~) but it is not going to be installed
        Depends: libnss3 (>= 2:3.30) but it is not going to be installed
        Depends: libnss3 (>= 3.26) but it is not going to be installed
        Depends: libxcomposite1 (>= 1:0.4.4-1) but it is not going to be installed
        Depends: libxdamage1 (>= 1:1.1) but it is not going to be installed
        Depends: libxfixes3 but it is not going to be installed
        Depends: libxkbcommon0 (>= 0.4.1) but it is not going to be installed
        Depends: libxkbfile1 but it is not going to be installed
        Depends: libxrandr2 but it is not going to be installed
        Depends: xdg-utils (>= 1.0.2) but it is not going to be installed
        Recommends: libvulkan1 but it is not going to be installed
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).

root@acid:/usr/local/# apt --fix-broken install
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Correcting dependencies... Done
The following packages were automatically installed and are no longer required:
  libblas3 liblinear4 nmap-common
Use 'apt autoremove' to remove them.
The following additional packages will be installed:
  adwaita-icon-theme alsa-topology-conf alsa-ucm-conf at-spi2-core dbus dbus-user-session dconf-gsettings-backend dconf-service
  glib-networking glib-networking-common glib-networking-services gsettings-desktop-schemas gtk-update-icon-cache hicolor-icon-theme
  libasound2 libasound2-data libatk-bridge2.0-0 libatk1.0-0 libatk1.0-data libatspi2.0-0 libauthen-sasl-perl libavahi-client3
  libavahi-common-data libavahi-common3 libcairo-gobject2 libclone-perl libcolord2 libcups2 libdata-dump-perl libdbus-1-3 libdconf1
  libdrm-amdgpu1 libdrm-common libdrm-intel1 libdrm-nouveau2 libdrm-radeon1 libdrm2 libencode-locale-perl libepoxy0
  libfile-basedir-perl libfile-desktopentry-perl libfile-listing-perl libfile-mimeinfo-perl libfont-afm-perl libfontenc1 libgbm1
  libgdk-pixbuf-2.0-0 libgdk-pixbuf2.0-bin libgdk-pixbuf2.0-common libgl1 libgl1-mesa-dri libglapi-mesa libglvnd0 libglx-mesa0
  libglx0 libgtk-3-0 libgtk-3-bin libgtk-3-common libhtml-form-perl libhtml-format-perl libhtml-parser-perl libhtml-tagset-perl
  libhtml-tree-perl libhttp-cookies-perl libhttp-daemon-perl libhttp-date-perl libhttp-message-perl libhttp-negotiate-perl
  libio-html-perl libio-socket-ssl-perl libio-stringy-perl libipc-system-simple-perl libjson-glib-1.0-0 libjson-glib-1.0-common
  liblcms2-2 libllvm11 liblwp-mediatypes-perl liblwp-protocol-https-perl libmailtools-perl libnet-dbus-perl libnet-http-perl
  libnet-smtp-ssl-perl libnet-ssleay-perl libnspr4 libnss3 libpciaccess0 libproxy1v5 librest-0.7-0 librsvg2-2 librsvg2-common
  libsoup-gnome2.4-1 libsoup2.4-1 libtie-ixhash-perl libtimedate-perl libtry-tiny-perl liburi-perl libvte-2.91-0 libvte-2.91-common
  libvulkan1 libwayland-client0 libwayland-cursor0 libwayland-egl1 libwayland-server0 libwww-perl libwww-robotrules-perl libx11-6
  libx11-protocol-perl libx11-xcb1 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-shape0 libxcb-sync1
  libxcb-xfixes0 libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxft2 libxi6 libxinerama1 libxkbcommon0 libxkbfile1
  libxml-parser-perl libxml-twig-perl libxml-xpathengine-perl libxrandr2 libxshmfence1 libxtst6 libxv1 libxxf86dga1 libxxf86vm1
  libz3-4 mesa-vulkan-drivers perl-openssl-defaults termit x11-utils x11-xserver-utils xdg-utils xkb-data
Suggested packages:
  libasound2-plugins alsa-utils libdigest-hmac-perl libgssapi-perl colord cups-common gvfs liblcms2-utils libcrypt-ssleay-perl
  pciutils librsvg2-bin libauthen-ntlm-perl libunicode-map8-perl libunicode-string-perl xml-twig-tools mesa-utils nickle cairo-5c
  xorg-docs-core
The following NEW packages will be installed:
  adwaita-icon-theme alsa-topology-conf alsa-ucm-conf at-spi2-core dbus-user-session dconf-gsettings-backend dconf-service
  glib-networking glib-networking-common glib-networking-services gsettings-desktop-schemas gtk-update-icon-cache hicolor-icon-theme
  libasound2 libasound2-data libatk-bridge2.0-0 libatk1.0-0 libatk1.0-data libatspi2.0-0 libauthen-sasl-perl libavahi-client3
  libavahi-common-data libavahi-common3 libcairo-gobject2 libclone-perl libcolord2 libcups2 libdata-dump-perl libdconf1
  libdrm-amdgpu1 libdrm-common libdrm-intel1 libdrm-nouveau2 libdrm-radeon1 libdrm2 libencode-locale-perl libepoxy0
  libfile-basedir-perl libfile-desktopentry-perl libfile-listing-perl libfile-mimeinfo-perl libfont-afm-perl libfontenc1 libgbm1
  libgdk-pixbuf-2.0-0 libgdk-pixbuf2.0-bin libgdk-pixbuf2.0-common libgl1 libgl1-mesa-dri libglapi-mesa libglvnd0 libglx-mesa0
  libglx0 libgtk-3-0 libgtk-3-bin libgtk-3-common libhtml-form-perl libhtml-format-perl libhtml-parser-perl libhtml-tagset-perl
  libhtml-tree-perl libhttp-cookies-perl libhttp-daemon-perl libhttp-date-perl libhttp-message-perl libhttp-negotiate-perl
  libio-html-perl libio-socket-ssl-perl libio-stringy-perl libipc-system-simple-perl libjson-glib-1.0-0 libjson-glib-1.0-common
  liblcms2-2 libllvm11 liblwp-mediatypes-perl liblwp-protocol-https-perl libmailtools-perl libnet-dbus-perl libnet-http-perl
  libnet-smtp-ssl-perl libnet-ssleay-perl libnspr4 libnss3 libpciaccess0 libproxy1v5 librest-0.7-0 librsvg2-2 librsvg2-common
  libsoup-gnome2.4-1 libsoup2.4-1 libtie-ixhash-perl libtimedate-perl libtry-tiny-perl liburi-perl libvte-2.91-0 libvte-2.91-common
  libvulkan1 libwayland-client0 libwayland-cursor0 libwayland-egl1 libwayland-server0 libwww-perl libwww-robotrules-perl
  libx11-protocol-perl libx11-xcb1 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-shape0 libxcb-sync1
  libxcb-xfixes0 libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxft2 libxi6 libxinerama1 libxkbcommon0 libxkbfile1
  libxml-parser-perl libxml-twig-perl libxml-xpathengine-perl libxrandr2 libxshmfence1 libxtst6 libxv1 libxxf86dga1 libxxf86vm1
  libz3-4 mesa-vulkan-drivers perl-openssl-defaults termit x11-utils x11-xserver-utils xdg-utils xkb-data
The following packages will be upgraded:
  dbus libdbus-1-3 libx11-6
3 upgraded, 139 newly installed, 0 to remove and 102 not upgraded.
1 not fully installed or removed.
Need to get 72.0 MB of archives.
After this operation, 285 MB of additional disk space will be used.
Do you want to continue? [Y/n]

 ,

Vlad-76
()

с++ привести тип std::string к указателю на другой тип

Форум — Development

server.cpp:81:66: error: invalid initialization of reference of type ‘const OctetStringPtr&’ {aka ‘const std::shared_ptr<std::vector<unsigned char> >&’} from expression of type ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’}

Или что почитать грамотное про это?

 

Vlad-76
()

UPS на 12 В из контроллера для солнечных батарей

Форум — Linux-hardware

Мое почтение, господа.

Поскольку подкроватный сервер и все окружающее его сетевое оборудование работает у меня от 12 или 9 В. Я подумал, а не сделать ли беcперебойник из автомобильного аккумулятора и контроллера, который используют вместе с солнечными панелями. Ну а сам контроллер уже запитать от какого-то 12-вольтового источника.
В идеале, хотелось бы иметь еще какой-то интерфейс (UART, I2C, etc), чтобы можно было получить состояние сети и/или заряд/напряжение аккумулятора.

Думал, у китайцев должна какая-то плата быть, у них же все есть на любой случай жизни — но не нашел. Может я плохо искал? Нормальный ли вариант с солнечным контроллером?

 

urxvt
()

Создание устойчивого серверного ПО

Форум — Development

Добрый день, ЛОР! Давно не постил, потому что нечего было сказать. А сейчас, кажется, есть.

Имеем проблему создания типичного транзакционного сервиса - банковское приложение, интернет-магазин, аренда чего-либо, т.д. Как сделать его устойчивым как с точки зрения корректности - запросы не теряются, дважды не повторяются, если не могут примениться - откатываются с отображением ошибки пользователю - так и с точки зрения UX - сервис сохраняет доступность?

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

Итак, начнём с идемпотентности - свойства запроса обладать возможностью быть исполненным несколько раз, и иметь эффект как от одного исполнения. Ценность в следующем - допустим, клиент производил запрос, и соединение оборвалось. Был запрос принят или нет - не понятно. Если клиент переводил на другой счёт деньги - может ли он обновить страницу и не бояться, что деньги спишутся дважды? Проще всего достижимо добавлением id запроса в его тело - если запрос уже был исполнен, операция не производится, и возвращается сохранённый результат.

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

Как достигнуть устойчивости? Имеем парк серверов, каждый из них выполняет свою операцию, с возможностью её отменить - их необходимо координировать в условиях риска выхода из строя серверов, ПО и сети. При выходе из строя сервера необходимо, чтобы он возобновил исполнение присвоенных ему операций - нужно сохранять их в реплицированную БД. Кажется, любая простая БД типа Ключ-Значение подойдёт. Когда исполнение возобновится - оно должно продолжить с момента последней транзакции в цепочке - то есть после каждой транзакции в цепочке, промежуточное состояние должно сохраняться в БД - с возможностью возобновления операции другим исполнителем.

Теперь координация задач - её можно производить либо централизованно, с механизмами RPC, либо распределённо, через брокер сообщений, с реакцией на их получение. В первом случае получаем лучшую отслеживаемость, во втором - большую устойчивость к отказу исполнителей - сообщения могут хранится в брокере.

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

Но какой должен быть лимит по ресурсам для абстрактного запроса? Поскольку если запрос - «Исполнить SQL выражение» (в случае, если наш сервис - база данных) - у него может быть самое разное потребление памяти и процессорного времени. Решением, на мой взгляд, будет разделение непредсказуемого запроса на предсказуемые - и заранее зная их количество и стоимость, можно оценить затраты на изначальный запрос. Для SQL запроса это будет сначала запрос типа PLAN - сам по себе достаточно предсказуемый - а затем проверка наличия ресурсов и исполнение для каждого шага плана. Но если верхнеуровневый запрос, не имеющий достаточно ресурсов, имеет смысл отбросить сразу - то порождённые запросы стоит выстраивать в очередь.

Зная ограничения по ресурсам, необходимо реализовать их соблюдение. В этом нам поможет ядро ОС - оно отслеживает объём памяти, закреплённый за процессом, и процессорное время, им затраченное. В Linux порог можно выставить командой ulimit и системным вызовом setrlimit. Вводить ограничения необходимо именно на уровне процесса, поскольку память по факту принадлежит не потоку и не корутине, а именно процессу (стек у каждого свой, но куча - общая для процесса), и если память кончается - OOM Killer убивает процесс. Ситуация сложнее для cgroup, в которых выставлено убийство всей cgroup сразу (как для подов в k8s), но это отдельная история, и ulimit можно ставить чуть ниже суммарного ограничения для cgroup. Теперь касательно процессорного времени - оно также действует на процесс целиком (может есть лимит на конкретный поток?). Конечно, запуск процесса под каждый запрос - схема плохо масштабируемая (хотя с идеологической точки зрения, кажется, наиболее правильная), поэтому можно использовать пул процессов, поднимающих свои лимиты для каждого запроса. Также можно запускать N корутин в каждом процессе - суммируя их лимиты. Если одна корутина перейдёт порог, убиты будут все N - но это лучше, чем если бы все запросы жили корутинами в одном процессе, и умерли бы все.

Я вполне представляю, как это можно реализовать для Reverse-proxy (nginx, apache), Python и gRPC. Для разных методов gRPC, каждый из которых предсказуем, указываем в Reverse Proxy свой обработчик - пул процессов. Python достаточно низкоуровневый для общения с ядром, чтобы каждый процесс мог менять свои лимиты. И реализация gRPC имеет параметр max_concurrent_rpcs - чтобы предотвратить DDOS (только на L7, или ещё на L3+4 - не знаю. Но кажется в любом случае, AntiDDOS на L3+4 умеет Reverse Proxy). Если вам подход показался разумным - как бы вы реализовывали на своём ЯП?

 , ,

lostghost1
()

Анализ процесса

Форум — Admin

Привет всем! Подскажите утилиту которой можно подключиться к процессу и увидеть, какая функция активно используется. Я ее использовал раньше, но сейчас не могу вспомнить название.

 

anonymus123
()

Для чего нужно EINTR?

Форум — Development

Многие системные вызовы могут возвращать ошибку и устанавливать errno == EINTR, при этом рекомендуется повторить системный вызов. Для чего это требуется? Это как то можно использовать в своей программе? Почему ядро не может само обработать эту ситуацию и перезапустить вызов?

 

iluha16
()

C++, boost asio, сетевой сервер на 10К клиентов.

Форум — Development

Ну, есть такая «проблема 10K» - потоков/процессов столько не насоздаёшь, да и нерационально иметь потоков больше числа ядер, а select() тоже не поюзаешь, ибо каждый раз гонять между ядром и приложением 10К-кусок данных - не круто. И тут приходит epoll и все радуются. Или там kqueue или чё-то такое.

А вот как это представлено в boost::asio?

kiverattes
()

Есть ли способ отловить, где течет С?

Форум — Development

Приветствую.

Есть С-код: https://github.com/derickr/pecl-dbus/blob/master/dbus.c

Если вкратце, этот код - биндинг полутора функций для работы с d-bus.

И этот код течет аки решето.

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

Вопрос: есть ли какой-нибудь изящный способ вывести все переменные объекта или иным способом отдебажить где жор?

Благодарю.

 ,

windows10
()

что значит & у поля класса?

Форум — Development

Например, есть код.

class A {
private:
  const X& x;
public:
  A(const X& x) : x(x) {};
  getX() { return x; }
}

int main() {
  X x1;
  A a(x1);
  std::cout<<a.getX()<<"\n";
}

Верно ли я понимаю что в таком случае созданная в main() переменная x1 типа X не будет копироваться, а поле класса x будет инициализировано ссылкой на оригинальный x1?

 

AndreyKl
()

Проект на чистом Си

Форум — Development

Камрады, всем доборый день!

Решил тряхнуть стариной, написать кое-что полезное для себя и таких же упоротых личностей. Заодно вспомнить Си (который без «крестов»). Естественно, хочется сделать «красиво, модно, молодёжно» и удобно. Вопрос - как проекты на Си принято начинать в 2024? Ну там пакетные менеджеры (а они вообще есть?), линтеры и прочее счастье. Какой стандарт сейчас считается «правильным» для использования и какую литературку/доку по нему почитать? Буду благодарен, если покидаетесь статьями или книгами.

 , , ,

small-entropy
()

Как мне реализовать системные вызовы?

Форум — Development

Если вы не слышали, я создаю гибридное ядро ОС, которое будет полностью свободным и лёгким. Как мне реализовать системные вызовы?

 , , , ,

anatoliy6463
()

LVM, Proxmox, NVME LV read only. Че делать

Форум — Linux-hardware

Столкнулся с проблемой что в одной из виртуальных машин посыпались ошибки дисковых операций типа:

[  +0.000006] EXT4-fs error (device dm-6): kmmpd:179: comm kmmpd-dm-6: Error wri                                                                                                                                                             ting to MMP block
[  +0.000006] blk_update_request: I/O error, dev nvme0n1, sector 57003600 op 0x1                                                                                                                                                             :(WRITE) flags 0x8800 phys_seg 1 prio class 2
[  +0.000006] EXT4-fs warning (device dm-6): ext4_end_bio:342: I/O error 10 writ 

первая мысль умер винт…но dmesg хоста ничего не говорил об ошибках в своих сообщениях. Похоже проблема моя описана тут: https://bugzilla.proxmox.com/show_bug.cgi?id=3738 , но решения из этого топика не решили проблему. Сейчас при попытке создать VM получаю ошибки:

 WARNING: Thin pool Gigabyte_nvme/Gigabyte_nvme needs check has read-only metadata.
  WARNING: Thin pool Gigabyte_nvme/Gigabyte_nvme has unexpected transaction id 18, expecting 19.
no lock found trying to remove 'create'  lock
error before or during data restore, some or all disks were not completely restored. VM 100 state is NOT cleaned up.

WARNING: Thin pool Gigabyte_nvme/Gigabyte_nvme needs check has read-only metadata. Сам же этот том находится в режиме только чтение:

 --- Logical volume ---
  LV Name                Gigabyte_nvme
  VG Name                Gigabyte_nvme
  LV UUID                Rg53rQ-MrG1-o1UF-c7UJ-VwOd-lcU1-mecQ40
  LV Write Access        read/write (activated read only)
  LV Creation host, time pve, 2023-03-09 11:22:50 +0300
  LV Pool metadata       Gigabyte_nvme_tmeta
  LV Pool data           Gigabyte_nvme_tdata
  LV Status              available
  # open                 0
  LV Size                493.39 GiB
  Allocated pool data    9.56%
  Allocated metadata     0.82%
  Current LE             126308
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     512
  Block device           253:5

утилита проверки выдает такое:


thin_check /dev/Gigabyte_nvme/Gigabyte_nvme_meta0
examining superblock
TRANSACTION_ID=18
METADATA_FREE_BLOCKS=1250303
examining devices tree
examining mapping tree
  thin device 2 is missing mappings [1699316, 1699444]
    bad checksum in btree node (block 9276)

Куда дальше копать то? может вообще по неправильному пути иду?

 , ,

pistoletov
()

Линукс, ассемблер и X11

Статьи — Разработка
Линукс, ассемблер и X11

Это текстовая версия моей статьи про разработку графического приложения на чистом ассемблере под линукс.

( читать дальше... )

 , ,

alex0x08
()

Разработка сетевой библиотеки на C++20: интеграция асинхронности и алгоритма Raft (часть 2)

Статьи — Разработка
Разработка сетевой библиотеки на C++20: интеграция асинхронности и алгоритма Raft (часть 2)

Эта статья является продолжением предыдущей публикации, в которой описывается разработка сетевой библиотеки на C++20. В данном продолжении акцент сделан на более детальном описании разработки алгоритма Raft и его интеграции с сетевой библиотекой.

( читать дальше... )

 , , ,

Reset
()

Разработка сетевой библиотеки на C++20: интеграция асинхронности и алгоритма Raft (часть 1)

Статьи — Разработка
Разработка сетевой библиотеки на C++20: интеграция асинхронности и алгоритма Raft (часть 1)

Введение

С годами работы в области распределённых систем, я понял, что мой опыт не будет полным без реализации алгоритма Raft. Это осознание побудило меня к действию: я решил создать свою реализацию, используя асинхронные возможности C++20.

( читать дальше... )

 , , , ,

Reset
()