LINUX.ORG.RU

Сообщения u5er

 

Как правильно вычитывать строки из потока?

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

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

Первый вариант хорош своей простотой, но плох большим количеством вызовов read()/recv(). Второй вариант хорош тем, что число вызовов read()/recv() будет минимально, но плох тем, что можно вычитать более одной строки и тогда вокруг данных после конца строки начинается пляска с бубном.

Как вообще принято реализовывать подобные вещи?

 

u5er
()

СИ: enum VS #define

У меня зачастую бывают такие ситуации, что я как осёл между двумя стогами сена стою и не могу для себя решить, что использовать в данном конкретном случае.

Напишите, чем вы руководствуетесь, когда решаете использовать дефайны или енумы.

P.S. Тема не имеет под собой какого-то конкретного случая. Просто хочу посмотреть на опыт других программистов.

 

u5er
()

Напомните название мобильника со свободным 3g модемом

Помню давно мелькали новости про свободный мобильник, у которога 2 модема: основной свободный 3g и второй проприетарный 4g. Там можно было отключать питание 4g модема. Не могу найти новость. Была достаточно давно 4+ лет назад.

u5er
()

Покритикуйте подход: запуск функций из массива указателей

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

int sx1509_init( struct BicOS* os ){
	
	int res;
	int i;
	
	const struct {
		int (*function)( struct BicOS* );
		const char* name;
	} initSequence[] = {
		{ gpioSetup,                  "GPIO setup"                    },
		{ deviceSetup,                "Device setup"                  },
		{ interruptHandlerSetup,      "Interrupt handler setup"       },
		{ interruptEventHandlerSetup, "Interrupt event handler setup" },
		{ keyboardSetup,              "Keyboard setup"                },
		{ debug_key_printer_register, "Deug key printer"              },
		{ NULL,                       NULL                            }
	};
	
	for( i = 0; initSequence[i].function; i++ ){
		
		res = initSequence[i].function( os );
		if( res ){
			printf( "{B} [sx1509] %s failed.\n", initSequence[i].name );
			return -1;
		}
	}
	
	return 0;
}

На первый взгляд оверхед у такого небольшой. Может у меня глаз замылился и я в упор не вижу подвоха? Какие у вас будут мнения на этот счёт?

 

u5er
()

Как победить git?

Гит снова выходит на связь:

$ git clone -b v5.3.1 --recursive https://github.com/espressif/esp-idf.git
Клонирование в «esp-idf»...
remote: Enumerating objects: 673982, done.
remote: Counting objects: 100% (9539/9539), done.
remote: Compressing objects: 100% (3825/3825), done.
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
error: 7330 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: неожиданный конец файла
fatal: fetch-pack: invalid index-pack output

Пробовал все советы отсюда ничего не помогло: ошибка всё равно происходит, но немного позже. Есть ещё варианты?

Также пробовал скачать zip-архив и распаковать его, но в моём случае это не сработало, т.к. сама idf полагается на гит.

Дополнительный вопрос: есть ли drop-in замена гиту, в которой разработчики осилили докачку?

 , ,

u5er
()

Графические программы засыпают при переключении терминала

Например, на tty1 запущены иксы и в них запущены различные программы. Если я переключусь на tty2, то эти программы через 5-10 секунд перестанут работать до тех пор, пока не переключусь обратно на tty1. Есть ли способ обойти это малой кровью без накатываний патчей на ядро?

u5er
()

Ищу специалиста по Dracut

В очередной раз я накатываю void на ssd на f2fs и в очередной раз я сталкиваюсь с ошибкой FLUSH_MERGE not compatible with readonly mode.

В этот раз меня это выбесило основательно и я закатал рукава и начал искать, откуда лезет эта дичь. Начинаем по порядку. Если ручками монтировать фс командой вида mount /dev/sda1 /mnt/1, то всё ок. Когда это делает initramfs, то не ок.

В сети нашёл информацию по прописыванию либо rw либо noflush_merge в командную строку ядра. Я решил пойти по пути прописывания rw - не помогло.

Дальше я полез изучать устройство содержимого initramfs. Опции монтирования лежат в /etc/cmdline.d/95root-dev.conf. Вот его содержимое в моём случае

 root=UUID=e10bcf2f-f3de-4bb4-993c-dbb82afa09ad rootfstype=f2fs rootflags=rw,noatime,lazytime,background_gc=on,nogc_merge,discard,discard_unit=block,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,barrier,extent_cache,mode=adaptive,active_logs=6,alloc_mode=default,checkpoint_merge,fsync_mode=posix,memory=normal,errors=continue

Как видно, тут есть опция rw, значит всё хорошо. Более того, если руками смонтировать раздел с этими опциями, то всё монтируется без проблем.

Дальше я решил сравнить эти опции с теми, которые используются фактически при монтировании. Оказалось, что в самом конце к ним добавляется ,rw,ro и таким образом фс пытается смонтироваться в режиме только чтения! И это вызывает ошибку.

Я полез искать по скриптам место, где отрабатывает вот это вот всё и нашёл файл /usr/lib/dracut/hooks/mount/99-mount-root.sh. Практически в самом начале есть такой участок кода

    _rflags_ro="$rflags,ro"
    _rflags_ro="${_rflags_ro##,}"

    while ! mount -t "${rootfs}" -o "$_rflags_ro" "${root#block:}" "$NEWROOT"; do
        warn "Failed to mount -t ${rootfs} -o $_rflags_ro ${root#block:} $NEWROOT"
        fsck_ask_err
    done

Из этого куска кода ясно, что к опциям монтирования в хвосте всегда приписывается ro.

Присмотревшись повнимательнее, я заметил, что параметры ro и rw в параметрах ядра всё же передаются и приписываются предпоследним параметром, но погоды это не делает, т.к. в конце всегда дописывается ro.

Теперь вопрос - они там на приколе что ли совсем? Это действительно захардкожено или я чего-то не понимаю? Как передать ему rw?

 ,

u5er
()

Странные странности AMDGPU

Карта rx7900xt. Система void.

На иксах в хроме при просмотре рутуба при разворачивании видео на весь экран иногда картинка зависает. При этом видео продолжает воспроизводиться - об этом свидетельствует звук. Хром получается закрыть только сочетанием клавиш оконного менеджера i3.

В ходе экспериментов удалось получить выхлоп хромого в консоль

[4160:4160:0920/203250.113396:ERROR:command_buffer_proxy_impl.cc(325)] GPU state invalid after WaitForGetOffsetInRange.
[4160:4160:0920/203250.149693:ERROR:gpu_process_host.cc(1007)] GPU process exited unexpectedly: exit_code=512

При этом в логе иксов начинается флуд

[ 13709.802] (WW) AMDGPU(0): flip queue failed: Invalid argument
[ 13709.802] (WW) AMDGPU(0): Page flip failed: Invalid argument
[ 13709.802] (EE) AMDGPU(0): present flip failed
[ 13709.831] (WW) AMDGPU(0): flip queue failed: Invalid argument
[ 13709.831] (WW) AMDGPU(0): Page flip failed: Invalid argument
[ 13709.831] (EE) AMDGPU(0): present flip failed
[ 13709.863] (WW) AMDGPU(0): flip queue failed: Invalid argument
[ 13709.863] (WW) AMDGPU(0): Page flip failed: Invalid argument
[ 13709.863] (EE) AMDGPU(0): present flip failed

Найти в сети ничего внятного не смог - есть похожие темы/багрепорты, но там глухо. Продолжаю наблюдения.

 , ,

u5er
()

Посоветуйте экранный переводчик под линукс

Нужен переводчик для перевода текста, который отображается на экране. В основном для перевода текста из игр, но иногда ещё и с картинок. В основном, с английского на русский, но было бы неплохо, если бы была поддержка и других языков.

 

u5er
()

Есть те, кто держит ноды PeerTube?

Предложение зеркалировать ютуб в связи с его нестабильной работой. Не все каналы, конечно же, но хотя бы что-нибудь.

 

u5er
()

Оптимальный способ хранения списка пользователей онлайн

Допустим, есть условный форум/чат/доска/etc с пользователями. Раньше я такое делал с помощью отдельной обычной SQL-таблицы, в которой хранились ники пользователей и время последней активности. Каждый раз, когда пользователь запрашивал страницу с сервера, он сначала вносился в эту таблицу(или обновлялось время последней активности), а потом из этой таблицы ему выдавался список всех пользователей онлайн.

Как такие задачи решаются в современном вебе?

u5er
()

Какие есть способы борьбы с диверсиями ассоциаций mime?

Иногда после установки/обновления ПО, ассоциации mime слетают.

Например, в системе настроено так, чтоб текстовые документы открывались в geany. После установки wine, они открываются в notepad.exe.

Есть какие-нибудь способы контролировать подобное поведение? Вопрос несёт глобальный характер и не ограничивается одним лишь вайном.

 

u5er
()

Отдельный раздел для read-only тем

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

 

u5er
()

Как отключить тачпад/мышь/клавиатуру в линуксе.

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

Задача. Отключить какое-нибудь устройство, чтоб оно перестало работать во всей системе: в иксах, в консоли и т.д..

Решение. В каталоге /sys/class/input перечислены все устройства ввода. Они все имеют маску input* где вместо звёздочки число. Внутри каждого каталога есть файлы name и inhibited. Файл name содержит в себе имя устройства. Файл inhibited служит для подавления ввода с устройства. Если записать в файл inhibited значение 1, то ввод с устройства отключится, а если записать 0, то снова будет работать. Таким образом следует найти нужное устройство читая файлы name и отключить ввод с него, записав единицу в файл inhibited.

 ,

u5er
()

Непредсказуемые сетевые имена.

Было: eno1, enp8s0 и wlp7s0.

Я вынул видеокарту, вынул звуковую карту и переместил её на несколько слотов вниз, чтобы освободить место под новую видеокарту, установил новую видеокарту на место предыдущей.

Стало: eno1, enp10s0 и wlp9s0.

Обе сетевые карты распаяны на материнке. Вафля установлена в слот M.2 и не трогалась.

Вопрос чисто из любопытства: как это работает?

u5er
()

Аврора ОС: как происходят обновления системы?

В сети искал и ничего внятного не нашёл. Я знаю 2 схемы обновлений:

  1. Как на андроиде. Обновы приходят ровно до тех пор, пока их клепает разработчик устройства. После окончания срока поддержки изволь купить новое устройство с новой версий системы.

  2. Как на пк. Обновления можно ставить до тех пор, пока это позволяет железо. Имею в виду производительность процессора, объём памяти и т.д., а не огороженность.

Сам вопрос: обновления происходят условно «как на андроиде» или «как на пк»? Или может быть по другой схеме?

 

u5er
()

Мини-опрос: как вы переключаете раскладку клавиатуры?

Любопытства ради. Сочетания клавиш? Напишите какие. Программы-переключалки? Напишите какие.

Я раньше долгое время использовал циклическое переключение по win+пробел, а относительно недавно перешёл левый контрол+win для английской и правый контрол+меню для русской.

 

u5er
()

В чём смысл исполняемых библиотек?

На досуге курил сборку библиотеки наткнулся на информацию, что библиотеку можно сделать исполняемой, прописав в ней функцию main() и дописав несколько опций в компилятор. Теперь сижу и чешу репу. В чём суть вообще такого? В моём понимании в библиотеку выносится такой код, который может использоваться разными программами. Какой практический смысл делать из самой библиотеки программу?

 

u5er
()

Cromium: как отключить влияние масштаба страницы на весь сайт?

Например, на сайте есть картинка, которую я открываю в новой вкладке и увеличиваю её с помощью Ctrl+колёсико мыши. После возврата на предыдущую вкладку (на ту, с которой я открывал картинку), выясняется, что тот масштаб, который я накрутил на картинке, применился ко всему сайту.

Вопрос: как настроить поведение таким образом, чтоб масштаб применялся только к содержимому той вкладки, где он изменялся, а не ко всему сайту?

 

u5er
()

Argv в main()

Хочу запустить из своего си кода другую программу с помощью execve() и передать ей часть тех аргументов, что передали моему коду. В документации по execve() сказано, что массив argv должен завершаться NULL. На практике argv[argc] действительно NULL.

Допустим, я хочу передать все аргументы, начиная с третьего. Руки чешутся написать что-то вроде такого:

char** nargv = &argv[2];
execve( ..., nargv, ... );

Насколько такое корректно и могу ли я полагаться на тот NULL-терминатор, который должен быть в конце массива argv? Может ли быть ситуация, что его там попросту не будет?

 

u5er
()

RSS подписка на новые темы