LINUX.ORG.RU

Сообщения elmir_k

 

как сделать интервальные счетчики в проге на си

всем привет!

Вопрос следующий.

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

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

Сигналы по таймеру? или есть что то другое, более правильное?

Как фиксировать допустим каждый час значение определенной метрики. Вот наверное главный вопрос...

Заранее спасибо!

 ,

elmir_k
()

плагинная архитектура, перечитать конфигурацию подключенного в рантайме плагина

приветы. В плагинной архитектуре, когда ядро подгружает различные so файлы (плагины), - как можно в рантайме заставить ядро перечитать конфиг конкретного одного плагина?

Сейчас ядро ждет SIGHUP и по нему перегружает все модули, что не совсем корректно. Вариант использовать под каждый плагин свой какой то сигнал выглядит топорно и вряд ли так делается.

Нужно сделать что то вроде CLI терминала к ядру? или заложить управляющие команды через argv?

Есть ли еще красивые и принятые в проде решения?

P.S. в итоге выбор пал на сокеты unix - так как гораздо проще потом поддерживать + масштабировать при появлении новых команд управления.

 ,

elmir_k
()

обновление so файла подгружаемой либы путем копирования с помощью cp

всем привет.

никак не могу понять одну вещь. Суть такая:

основной код подключает плагин, который подключается в виде so. файл лежит в папке plugins. Основной код использует функцию f1 из плагина.

Я еще раз, без изменения кода компилирую so файл и командой cp копирую его в папку plugins. Основной код падает при этом, при попытке обращения к функции f1.

Но если перед вызовов cp удалить старую версию плагина с помощю rm - то при замене файла плагина основной код не падает и я могу переподключить плагин сигналом.

почему так? пробовал флаги LASY и NOW при dlopen - флаги не влияют.

 ,

elmir_k
()

shared memory + cond variables + mutexes

доброго дня!

пытаюсь протестирвоать следующую обвязку. Процесс Producer + процесс Consumer (независимые процесс). Обмен данными идет по shared memory с использованием мьютекса и условной переменной, которые запилены в структуре, которая помещаяется в shared memory.

Вопрос - почему когда умирает producer, mutex остается навечно залоченным и соответственно consumer не может его захватить?

Предполагаю, что это такая фича мьютексов, так как при умирании продюсера этот мутекс так и остается залоченным.

Как можно сделать так, чтобы при падении продюсера скидывать лок с его мьютекса?

Заранее спасибо,

 , ,

elmir_k
()

gcc атрибуты constructor/destructor

добрый день,

подскажите пару годных use cases когда используются эти расширения gcc для чистого си?

почему то же они появились в gcc - знать бы зачем

 ,

elmir_k
()

условный tracing межмодульных данных си

приветы. подскажите плз в какую сторону начать думать по следующему вопросу.

допустим, есть приложение на си, которое на вход получает некое сообщение состоящее из набора параметров a, b , c. Приложение модульное, сообщение прогоняется через несколько модулей и генерирует некоторый результат.

Возникла задача - как допустим принтэфить входные и выходные данные для каждого модуля для входного сообщения с определенным значением параметра а = A1. К примеру у приложения есть консоль, я подключаюсь к консоли и задаю режим trace и указываю параметр a = A1 и жду в консоли межмодульный трейс коррелирующий с A1

Вариант с постоянным if в коде как то не устраивает, думаю есть что то изящное и уже устоявшееся в мире.

 ,

elmir_k
()

while(true) в потоке грузит cpu

приветы. вопрос: в приложении крутится в бесконечном while второй поток, который нужен только лишь для отлова сигналов, которые генерятся в первом потоке. из за этого while cpu загружен на 100%. Существуют ли какие нибудь устоявшиеся конструкции кроме sleep, чтобы снизить cpu load из за этого while? Использование sleep не повлияет на обработчик сигналов во втором потоке? Синхронизацию между потоками как то использовать не хочется, чтобы минимизировать блокировки в первом потоке.

 , ,

elmir_k
()

select на сокете, получение «протухших» данных

приветы

допустим, есть два процесса - п1 и п2. Связаны между собой через unix доменный сокет. п1 пишет в п2 некоторые данные и ждет результат Р1 выполнения, который п2 должен закинуть в этот сокет. п1 ждет этот результат с помощью select с таймаутом.

В итоге, по истечении таймаута п1 выполняет некоторую другую работу (а в этот момент допустим п2 все таки запишет результат Р1 в сокет) и потребуется допустим еще раз отправить уже какие то другие данные потоку п2 и получить от п2 уже результат Р2 обработки новых данных.

Что будет когда п1 вызовет select с таймаутом во второй раз:

- 1) select сразу вернет управление и recv прочитает «протухшие» данные из сокета, то есть Р1? - 2) что прочитает п2 из сокета - то что он туда записал Р1 или новые данные от п1 (допустим чтение идет одинаковыми размерами)?

И вопрос еще - как это побороть? может есть какой то устоявшийся механизм или дело просто в доработке протокола обмена между п1 и п2?

вопрос 2 в итоге к тупому вопросу можно свести - если процесс п2 записал в сокет 16 байт, но никто этот сокет не прочитал, и процесс п1 записал в сокет еще 16 байт, то потом если процесс п2 будет считать куском 16 байт - какие данные он получит?

 ,

elmir_k
()

вариант thread pool

добрый день,

Посоветуйте плз как организовать получше логику для решения задачки.

Есть главный поток (назовем main) который читает сообщения(джобы) из входной очереди сообщений. Каждое такое сообщение содержит ID. Прочитанное сообщение надо далее передать определенному потоку (worker), который ждет сообщения только с этим ID (в воркерах используется fsm).

К примеру, может быть 1024 уникальных ID. И я создаю заранее 1024 потока. Как передавать сообщения отдельным потокам?

В голове крутится вариант, что каждый поток worker должен иметь доступ к своей очереди сообщений, в которую пишет main поток, на основе полученного ID сообщения из входной очереди. Или есть варианты получше и более стандарнтые?

заранее спасибо,

 , ,

elmir_k
()

передача сигнала с инфой от одного потока другому

Приветы!

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

Предполагается передавать параметр ID в виде нагрузки какого либо сигнала, который будет вызываться sigqueue. Этот сигнал мы залочим в потоке main, но будет ловить и обрабатывать во втором потоке.

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

спасибо.

 ,

elmir_k
()

linphone + raspberry + autoanswer

приветы.

установил из исходников linphone на распберри, подключена вэбка + регистрация на внешнем 13 астериске, кодек на распе - VP8.

Запускаю linphonec и когда принимаю в консоли входящий вызов командой answer, то linphonec падает - segmentation fault. Но когда принимаю вызов командой answer <call_id> где call id - айди вызова, который показывает в консоли линфон - то все ок, трубка поднимается.

По этой же причине не работает linphonec -a --- также при входящем вызове при попытке автоподнятия трубки приложение падает с сигфолтом.

В логах ничего не нашел, в чем может быть проблема?

UPD: gdb and backtrace помогли найти функцию, которая падала. В итоге выяснил что код этой самой функции почему то кривой лежит в мастер ветке линфона на гитхабе. Поправил слегка исходник - вроде автоответ заработал. надеюсь другое не сломалось.

 ,

elmir_k
()

сравнение двух jpg файлов и отправка на сервак только лишь дельты

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

UPD: спасибо откликнувшимся, буду думать о предложенных вариантах.

 , ,

elmir_k
()

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

добрый вечер, пытаюсь понять почему не работает следующий простой пример

file1.c

#include "abc.h"
int main() {
BULK sample; //BULK typedefed in abc.h
sample.offset =0;
change_data(&sample);
printf ("data = %i\n", sample->offset); // выводит 0!!!???
return 0;
} 

file2.c

int change_data(BULK *data) {
     data->offset = 14;
     printf ("data = %i\n", data->offset); // выводит 14
    return 0;
 }

Если весь код разместить в один файл - то все норм отрабатывает. что не так?

 

elmir_k
()

архитектура отказоустойчивого решения

всем привет. имеется приложение, которое крутится на серваке ubuntu и общается с удаленным хостом. возник вопрос как организовать такую систему, чтобы было два сервера, мастер и слэйв, при падении приложении на мастере (или при проблеме с самим сервером) чтобы автоматически запускалось приложение(это же) на слэйве? в какую сторону смотреть чтобы был подобный failover? В какую сторону смотреть - а там разберемся сами.

 

elmir_k
()

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