Предлагаю пресоедениться к разработке моего open-source проекта на Си под Linux - HWMonitor.
HWMonitor - консольная утилита наподобие htop,iotop, которая отслеживает активность различных узлов системы. На данный помент реализована система block device, network interface, memory statistics, cpu load. Утилита показывает активность в удобном для человека формате и подсвечивает интенсивность. Написана на языке С11, from scratch. Из сторонних либ использует только ncurses для отображения интерфейса. Так же используются утилиты lsblk и df, для получения данных о дисках планируется использование своих алгоритмов. Вся программа пишется в одном файле по личным соображениям и религиозным взглядам автора. Система сборки CMake, Make.
Ядро линукс на машине разработки - 4.8. Компилятор GCC - 6.2.1. Так же возможна сборка под clang. Версия libc - 2.24.
Если вы хотите поучавствовать в разработки и улучшении проекта, вам необходимо форкнуть его себе на гитхабе и создать pull request. Вы не должны использовать никаких сторонних библиотек, писать код только на Си под 11 стандарт, придерживаться стиля автора, не плодить велосипеды и максимально использовать существующий код проекта, который при необходимости можете модифицировать.
>>904139 (OP) Форматирование кода ниоч. Нет единого стиля. Даже в одном определении функции в параметрах у одних указателей звёздочка прижата к типу, у других — к имени параметра.
>>904268 Да, это IDE реформат сама делает. Щас перенстроил отформатировал как надо, заодно сделал небольшой рефакторинг.
>>904309 В проекте есть и Makefile. CMake использует моя IDE, к тому же, я уже достаточно привык к нему.
>>904322 Тут дело не в преимуществе, а ином формате представления данных пользователю. Например iotop показывает IO активность процессов, но не показывает на какое устройство, а у меня наоборот нету дерева процессов, зато есть список устройств на которых происходит активность. К тому же проект открытый и пользователи сами могут сделать то чего им не хватает в других утилитах.
>>904354 >Видел исходники sqlite? 200к строк, один файл. Этот после амальгамации. Файл склеивается скриптом из кучи отдельных файлов.
> Щас перенстроил отформатировал как надо, заодно сделал небольшой рефакторинг. За коммиты в +-2k строк нужно бить ебало. Даже хуёвый стиль лучше таких вот коммитов.
>>904886 >Ну да, зачем нам падать по out of memory, лучше упадем по stack overflow А может оно просто не в настроении? Если долго просить, может быть, оно сдастся? А ты бы лучше не критиковал, а пример брал с человека - он-то девственности точно лишился.
>>905589 Возможно анон и прав. Возможно для открытого проекта действительно будет лучше разделения кода по мелким файлам для удобства коммитов. Но опять же 5к строк не много, для небольшой программы.
>>907019 Ну давай, расскажи мне, что такого должно произойти в языке без гц, чтобы если ты не смог выделать память один раз, то смог бы сделать это с третьеё/пятой/етц попытки, не предпринимая никаких дополнительных действий. мимо
>>904139 (OP) Давай тоже тебя покритикую. >animation_bug Плохо сделал. Мало того, что в рантайме производишь инициализацию 48 переменных, так ещё и флаг инициализации, а это не нужно. Если уж хочешь так сделать, инициализируй как статический константный массив. static const char movie[ ] = { "str1", "str2", ... }; >if (frame >= 47) if (frame >= sizeof(movie)) Ну и далее. Хотя лучше сделать циклом. Количество подчёркиваний до, количество после и сама строка. Ничего сложного нет. >>906529 >zalloc - обертка над аллокаторами, сделанная для отладки и возможного управления памятью. Но зачем? Ты собираешься управлять памятью сам? Нет? Не городи лишнего. И согласен с аноном, что лучше возвращать нулевой указатель, так программа сразу упадёт после первой же попытки использования нулевого указателя, а не где-то далеко наверху. И вопрос - а зачем u64 для памяти? Ты планируешь выделять более 4 Гб? >5к строк для си проги ничего особенного, бывают исходники намного больше Не знаю, что за IDE, но мне уже не удобно, когда более 500 строк в файле. >static FILE stdlog = NULL; > = NULL Но зачем? >static inline void Но зачем ещё и inline? Оптимизатор и без тебя додумается её заинлайнить. Или проигнорирует, даже если укажешь.
>>904139 (OP) Давай тоже тебя покритикую. >animation_bug Плохо сделал. Мало того, что в рантайме производишь инициализацию 48 переменных, так ещё и флаг инициализации, а это не нужно. Если уж хочешь так сделать, инициализируй как статический константный массив. static const char⚹ movie[ ] = { "str1", "str2", ... }; >if (frame >= 47) if (frame >= sizeof(movie)) Ну и далее. Хотя лучше сделать циклом. Количество подчёркиваний до, количество после и сама строка. Ничего сложного нет. >>906529 >zalloc - обертка над аллокаторами, сделанная для отладки и возможного управления памятью. Но зачем? Ты собираешься управлять памятью сам? Нет? Не городи лишнего. И согласен с аноном, что лучше возвращать нулевой указатель, так программа сразу упадёт после первой же попытки использования нулевого указателя, а не где-то далеко наверху. И вопрос - а зачем u64 для памяти? Ты планируешь выделять более 4 Гб? >5к строк для си проги ничего особенного, бывают исходники намного больше Не знаю, что за IDE, но мне уже не удобно, когда более 500 строк в файле. >static FILE⚹ stdlog = NULL; > = NULL Но зачем? >static inline void Но зачем ещё и inline? Оптимизатор и без тебя додумается её заинлайнить. Или проигнорирует, даже если укажешь.
>>907109 >все переменные надо инициализировать при объявлении Наверное, ты не заметил объявления переменной: >static FILE⚹ stdlog = NULL; Так зачем static переменную занулять, если она и так зануляется при запуске программы?
>>907108 Я не буду за тебя гуглить. Вообще, я подумал немного и понял, что такое может, конечно, быть, но ты всё равно хуйню написал, ибо без приостановки программы минут эдак на 10 нет смысла даже пытаться переаллоцировать. Да там вообще нет смысла пытаться что-то делать, потому что системе на этот момент уже очень давно очень плохо. И это при условии, что сишный маллок при недостатке памяти пытается аллоцировать новый хип. Если нет, то всё ещё веселее.
>>904139 (OP) Ох, ты вернул 2007, когда каждый школьник считал своим долгом напесать свой монитор загрузки. А так, вот нахой ты это делаешь? Деды не зря продвигали KISS, а ты набучиваешь всё вместе, неадекват. Если пользователю надо вывести вывести сразу несколько наборов данных, то он откроет несколько окон, и сраный тайловый менеджер всё это слепит вместе.
>>907048 Память может освободиться представляешь? Конечно стоило туда дописать еще делей пару мс. А может и стоит падать если NULL, конечно тут вопрос филосовский. На самом деле на десктопе достаточно сложно NULL получить.
>>907065 >animation_bug >Плохо сделал Да сделал, как сделал. Конечно замечания дельные, но эта функция что-то типа прикола и помощи в тесте на малых значениях семплинга.
>zalloc >Но зачем? Ты собираешься управлять памятью сам? Нет? Не городи лишнего. Пример гибкого проектирования. Вдруг я захочу сделать управляемую память, что мне потом во всем коде искать малоки и заменять их?
>И вопрос - а зачем u64 для памяти? Ты планируешь выделять более 4 Гб?
Во-первых на х86_64 битной архитектуре, size_t имеет размер в 64 бита, а программа заточена именно под эту архитектуру. Во-вторых, на этой архитектуре регистры процессора 64 битные конечно есть и 32 битные, что позволяет оперировать данными, грубо говоря, за 1 цикл процессора на самом деле на современных суперскалярных процессорах с множеством вычислительных конвееров и механизмом предсказаний ветвления среднее время на инструкцию может быть гораздо ниже. + оптимизирующий компилятор лучше оптимизирует такой код.
>Не знаю, что за IDE, но мне уже не удобно, когда более 500 строк в файле. Видимо ты в проде никогда не работал еще. Я уже 10 лет на плюсах пишу и не такое видал.
>static FILE stdlog = NULL; > = NULL >Но зачем?
Просто привычка и для лучшей читабельности кода.
>static inline void >Но зачем ещё и inline? Оптимизатор и без тебя додумается её заинлайнить. Или проигнорирует, даже если укажешь.
А вот и не всегда. Оптимизатор может вообще ее не заинлайнить например если она будет объявлена extern, так же если она будет объявленна в заголовочном файле и реализована в другом месте кстати во многом из-за возможности большей оптимизации мной была выбранна такая архитектура кода в один файл.. Дело в том что ключевое слово static вкупе с inline дает компилятору понять что функция будет отдельной копией для каждого юнита трансляции которую желательно заинлайнить.
>>907214 >KISS >ДЕДЫ >ПАРАДИГМЫ >ПРИНЦИПЫ >КОКОКО Делать мне нехуй вот и пишу всякие "бесполезные" проги.
>>907316 >Вдруг я захочу сделать управляемую память, что мне потом во всем коде искать малоки и заменять их Вот именно, что если захочешь. Заменить malloc можно будет через дефайн. Не нужно усложнять программу без необходимости. Это как C++, когда делают абстрактный класс, а от него только один класс наследуют. Вот зачем так? Не лучше ли сразу же один класс сделать без виртуальных функций? Ведь в таком случае нужно будет делать в 2 раза больше работы по поддержке двух интерфейсов. Вроде бы этот пример был в книге "Совершенный код". >Я уже 10 лет на плюсах пишу и не такое видал. Но это же не хорошо так делать, ты же сам пишешь. Твоё дело. >Оптимизатор может вообще ее не заинлайнить Ты проверял? Мне иногда интересно, что оптимизатор наоптимизировал. Сам под виндой, IDE VisualStudio2005, подозреваю, что у GCC или Clang оптимизация получше будет. Так вот - чистый C оптимизируется просто замечательно. Настолько замечательно, что callback может быть заинлайнен через 3 функции. Все функции в одну-две строчки, даже если они глобальные (не экспортируемые), оптимизатор подставляет по месту вызова. Случаются и некоторые странности - оптимизатор может заинлайнить вызов функции в одном месте, но вызывать её в другом. Но это уже функция в десяток строк и более. А как оптимизатор обфусцирует код - потом и не разберёшь, как изначально в исходнике было. >ключевое слово static вкупе с inline А без inline, значит, не даёт понять? >>907409 >BSS блок Что за BSS блок? Ты, давай, не ругайся. Все неинициализированные переменные размещаются в секции неинициализированных данных. Эта секция отсутствует в файле, там указывается только размер и адрес. При загрузке файла под эту секцию выделяется необходимый размер памяти. Вот он то и забит нулями. Точнее, память выделяется уже очищенная от предыдущих данных.
>>907550 Да не пофиг ли как оно реализовано? Секция-хуекция... кстати, сегмент, а не секция, если говорить об ELF В стандарте русским по белому написано что зануляются.
Вообще мне всегда казалось, что то что static по умолчанию null - справедливо для всех областей видимости кроме глобальной, в глобальной же статик управляется настройками компилятора, в частности для nullable: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html см. -fno-zero-initialized-in-bss
Пункты же 6.8.х относятся ко вложенным областям видимости.
>>907267 Спасибо. Обосрался, признаю. Но я по прeжнему настаиваю, что стоит всегда и везде использовать explicit initialization. Это хорошая практика. Дефолтный инишиалайзер для юнионов, например, ведет себя не так, как я бы ожидал. Ну и это больше маняврирование в наше время, но NULL не обязан быть 0.
> An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.⁶⁶ > 66) The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant; see 7.19.
>>907846 >Ну и это больше маняврирование в наше время, но NULL не обязан быть 0. Что ещё расскажешь?
>>907851 Сука и правда. Откуда тогда у меня в голове столько дерьма? Я где-то прочел/кто-то мне сказал, что NULL это специальный адрес памяти, обращение к которой обязано вызвать КРОВЬКИШКИРАСПИДАРАСИЛО. И быть 0 это значение не обязано.
Вот и пизди после этого с апломбом. Все, блять надо перепроверять самому, никому верить нельзя.
>>907875 NULL это null pointer constant и она может быть 0 либо ((void*)0). null pointer, т.е. результат присвоения null pointer constant указателю, таки да, не обязан в своём битовом представлении иметь все биты = 0.
HWMonitor - консольная утилита наподобие htop,iotop, которая отслеживает активность различных узлов системы. На данный помент реализована система block device, network interface, memory statistics, cpu load. Утилита показывает активность в удобном для человека формате и подсвечивает интенсивность. Написана на языке С11, from scratch. Из сторонних либ использует только ncurses для отображения интерфейса. Так же используются утилиты lsblk и df, для получения данных о дисках планируется использование своих алгоритмов.
Вся программа пишется в одном файле по личным соображениям и религиозным взглядам автора.
Система сборки CMake, Make.
Ядро линукс на машине разработки - 4.8.
Компилятор GCC - 6.2.1. Так же возможна сборка под clang.
Версия libc - 2.24.
Если вы хотите поучавствовать в разработки и улучшении проекта, вам необходимо форкнуть его себе на гитхабе и создать pull request. Вы не должны использовать никаких сторонних библиотек, писать код только на Си под 11 стандарт, придерживаться стиля автора, не плодить велосипеды и максимально использовать существующий код проекта, который при необходимости можете модифицировать.
Проект выпускается под лицензией GPLv3.
Ссылка на проект: https://github.com/GregoryIstratov/HWMonitor