Все сигналы обрабатывать не забываем )
Ещё да, fcntl на fd сделать надо )
Проверить режим ввода-вывода.
Вдруг в этом юниксе fd==1 — стандартный ввод? :-D
В ANSI C (C89) переменные объявляются как и в K&R C, в начале блока _функции_, либо в глобальном пространстве.
Всякие переменные_в_цикле, переменные_в_ифе и прочие — это 99.
C99 в полной мере не поддерживается GNU :)
(Кусок man gcc)
> ISO C99. Note that this standard is not yet fully supported; see
> <gcc.gnu.org/gcc-4.2/c99status.html> for more information.
Не пользуйтесь коряво-поддерживаемыми стандартами. Кошерный Си — это C89.
А остальное — non-KISS way :)
Вы ничего не понимаете в программировании (с)
Если в AppInit_DLLs (упаси Вас от такого) случайно окажется «кривая» dll, ляжет вся система. И не загрузится. Не надо прикрывать собственное невежество громкими словами. Лучше почитайте умные книги.
А проблема в том, что нормальный AV сразу вешает свой драйвер и хучит почти все «отладочные» функции на себя. Причем именно их NT-реализацию (а это null-ring), что не позволяет пользоваться заглушками на библиотеки (вроде переписывания какой-нибудь user32.dll). Яркий пример — Комода.
Это всё так и чистится через SD-таблицу, перехватывая вызовы ядерных NtAPI функций. Примеры приводить не буду (ибо это — точно счастье кулхацкеров), но самый банальный пример — подгрузка своего драйвера (который суть PEXE файл с определенной точной входа, но исполняется в контексте ядра), прописывания хук-функций по статичным адресам по смещению от адреса krnl и запись этих адресов в SDT поверх старых.
>Ага, то-то постоянно появляются всякие ядерные эксплойты под Unix
Под Linux, уважаемый, под Linux они появляются. И всё потому, что слишком много программистов, которым «понятнее и удобнее» писать кривой код и включать его в ядро.
Найдите-ка ошибки в OpenBSD?
Или в vsftpd? В OpenSSH? :)
Да даже если сравнивать Linux (_реально_ эксплуатируемые дыры, а не int-переполнения) и альтернативные ОС, написанные как-раз вашим подходом — выбор будет в пользу Linux.
>Пока передаются маленькие объемы данных, это может и не очень заметно, а вот когда надо перекачивать много информации (например, X-server — X-client) — это все становится жутко неэффективным.
Это не имеет отношения к Си, это скорее к архитектуре x86.
>А почему бы не сделать язык, совмещающий преимщества обеих миров — удобный — но хорошо компилируемый.
Главное, что устраивает меня и моего заказчика.
Кстати, на Си как-то написали такую штуку, как Unix. На Си написано почти всё окружение GNU. На Си пишется очень много всего. И никому не приходит в голову добавлять туда сборщик мусора.
А ваше — «не прокатит, все будет слишком сложно и запутанно и приведет к куче ощибок» говорит о том, что вы просто не умеете писать на Си.
Но ведь вас никто не заставляет? :)
Подсчет ссылок — это уже дело программиста.
Не поверите — столько всего писал (в основном под *nix), начиная от заглушек на 80 порт и заканчивая счетчиками траффика — и все проблемы решаются «на раз». А strdup кстати — очень быстрая функция.
Горааздо быстрее, чем интерпретация байт-кода Явы.
Другое дело, если программист не знает архитектуры и языка, на котором пишет. Тогда ему просто необходим «умный» компилятор типо VB :)
Вложенность не ограничена. Можно писать как через рекурсию, так и через итерацию.
Это — базовый шаблон :)
Хотя иногда проще использовать статичные буфера и макросы для работы с ними.
1. В нужных местах ставим const.
2. Учим ассемблер и понятие «страница памяти».
Оперируем страницами — mmap() в помощь.
3. Есть такая штука, как inline.
А ещё есть аргумент register.
4. И вообще, классы — это C++. Я лично пишу на чистом ANSI C :)
C++ это всякие new, delete и прочее. Не путайте.
P.S. DOM я может и не писал, но многоуровневые вложенные структуры с динамическим числом элементов и неограниченной вложеностью — писал. И знаете (!!111) — работает! И памяти жрёт в разы меньше (а сейчас в меня полетят минусы) «этой вашей» явы.
Ещё да, fcntl на fd сделать надо )
Проверить режим ввода-вывода.
Вдруг в этом юниксе fd==1 — стандартный ввод? :-D
А смысл?
Всякие переменные_в_цикле, переменные_в_ифе и прочие — это 99.
(Кусок man gcc)
> ISO C99. Note that this standard is not yet fully supported; see
> <gcc.gnu.org/gcc-4.2/c99status.html> for more information.
Не пользуйтесь коряво-поддерживаемыми стандартами. Кошерный Си — это C89.
А остальное — non-KISS way :)
Пользуйтесь стандартом ANSI C (c89) и будет вам счастье.
Если в AppInit_DLLs (упаси Вас от такого) случайно окажется «кривая» dll, ляжет вся система. И не загрузится. Не надо прикрывать собственное невежество громкими словами. Лучше почитайте умные книги.
А если руки из известного места растут у Вас — это не повод ругаться на Рихтера & co.
Под Linux, уважаемый, под Linux они появляются. И всё потому, что слишком много программистов, которым «понятнее и удобнее» писать кривой код и включать его в ядро.
Найдите-ка ошибки в OpenBSD?
Или в vsftpd? В OpenSSH? :)
Да даже если сравнивать Linux (_реально_ эксплуатируемые дыры, а не int-переполнения) и альтернативные ОС, написанные как-раз вашим подходом — выбор будет в пользу Linux.
>Пока передаются маленькие объемы данных, это может и не очень заметно, а вот когда надо перекачивать много информации (например, X-server — X-client) — это все становится жутко неэффективным.
Это не имеет отношения к Си, это скорее к архитектуре x86.
>А почему бы не сделать язык, совмещающий преимщества обеих миров — удобный — но хорошо компилируемый.
Найдете такой — сообщите ;)
Кстати, на Си как-то написали такую штуку, как Unix. На Си написано почти всё окружение GNU. На Си пишется очень много всего. И никому не приходит в голову добавлять туда сборщик мусора.
А ваше — «не прокатит, все будет слишком сложно и запутанно и приведет к куче ощибок» говорит о том, что вы просто не умеете писать на Си.
Но ведь вас никто не заставляет? :)
Не поверите — столько всего писал (в основном под *nix), начиная от заглушек на 80 порт и заканчивая счетчиками траффика — и все проблемы решаются «на раз». А strdup кстати — очень быстрая функция.
Горааздо быстрее, чем интерпретация байт-кода Явы.
Другое дело, если программист не знает архитектуры и языка, на котором пишет. Тогда ему просто необходим «умный» компилятор типо VB :)
> return ms->result;
Простите, но может быть Вы сначала разберетесь с базовыми понятиями языка Си? :)
Стандартный пример:
<code> struct idx { uint_32 key; uchar_8 *val; }; int main() { uint_32 i = DEF_CONST; uint_32 idx_cnt; struct idx **ptr = NULL; for(idx_cnt = 0;idx_cnt<i;idx_cnt++) { ptr = realloc(ptr, sizeof(struct idx *)*(idx_cnt+1)); ptr[idx_cnt] = malloc(sizeof(struct idx)); ptr[idx_cnt]->val = strdup("val31337"); } // делаем шото for(i=0;i<idx_cnt;i++) { free(ptr[i]->val); free(ptr[i]); } free(ptr); return 0; } </code>Вложенность не ограничена. Можно писать как через рекурсию, так и через итерацию.
Это — базовый шаблон :)
Хотя иногда проще использовать статичные буфера и макросы для работы с ними.
2. Учим ассемблер и понятие «страница памяти».
Оперируем страницами — mmap() в помощь.
3. Есть такая штука, как inline.
А ещё есть аргумент register.
4. И вообще, классы — это C++. Я лично пишу на чистом ANSI C :)
C++ это всякие new, delete и прочее. Не путайте.
char *somefunc(int n) {static char *buf = NULL;
if(buf) free(buf);
buf = malloc(n);
return buf;
}
А если Вы на «моих сях» не можете писать вменяемый код — это ваши персональные проблемы.
Я на них пишу со школы, вместо бейсика. И ни разу не пожалел.