Pull to refresh
83

IT enthusiast

36
Subscribers
Send message
Все сигналы обрабатывать не забываем )
Ещё да, fcntl на fd сделать надо )
Проверить режим ввода-вывода.
Вдруг в этом юниксе fd==1 — стандартный ввод? :-D
То есть написать свой stdio? :-)
А смысл?
В 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 :)
Объявлять переменные внутри циклов — это не классический Си.
Пользуйтесь стандартом ANSI C (c89) и будет вам счастье.
Вы ничего не понимаете в программировании (с)
Если в AppInit_DLLs (упаси Вас от такого) случайно окажется «кривая» dll, ляжет вся система. И не загрузится. Не надо прикрывать собственное невежество громкими словами. Лучше почитайте умные книги.
А проблема в том, что нормальный AV сразу вешает свой драйвер и хучит почти все «отладочные» функции на себя. Причем именно их NT-реализацию (а это null-ring), что не позволяет пользоваться заглушками на библиотеки (вроде переписывания какой-нибудь user32.dll). Яркий пример — Комода.
Вы немного не поняли сути. Это абсолютно «легальный» метод.
А если руки из известного места растут у Вас — это не повод ругаться на Рихтера & co.
Это всё так и чистится через SD-таблицу, перехватывая вызовы ядерных NtAPI функций. Примеры приводить не буду (ибо это — точно счастье кулхацкеров), но самый банальный пример — подгрузка своего драйвера (который суть PEXE файл с определенной точной входа, но исполняется в контексте ядра), прописывания хук-функций по статичным адресам по смещению от адреса krnl и запись этих адресов в SDT поверх старых.
А по-моему — копипаста с wasm'а. Года этак 2005го.
>Ага, то-то постоянно появляются всякие ядерные эксплойты под Unix
Под Linux, уважаемый, под Linux они появляются. И всё потому, что слишком много программистов, которым «понятнее и удобнее» писать кривой код и включать его в ядро.
Найдите-ка ошибки в OpenBSD?
Или в vsftpd? В OpenSSH? :)
Да даже если сравнивать Linux (_реально_ эксплуатируемые дыры, а не int-переполнения) и альтернативные ОС, написанные как-раз вашим подходом — выбор будет в пользу Linux.

>Пока передаются маленькие объемы данных, это может и не очень заметно, а вот когда надо перекачивать много информации (например, X-server — X-client) — это все становится жутко неэффективным.
Это не имеет отношения к Си, это скорее к архитектуре x86.

>А почему бы не сделать язык, совмещающий преимщества обеих миров — удобный — но хорошо компилируемый.

Найдете такой — сообщите ;)
Главное, что устраивает меня и моего заказчика.
Кстати, на Си как-то написали такую штуку, как Unix. На Си написано почти всё окружение GNU. На Си пишется очень много всего. И никому не приходит в голову добавлять туда сборщик мусора.
А ваше — «не прокатит, все будет слишком сложно и запутанно и приведет к куче ощибок» говорит о том, что вы просто не умеете писать на Си.
Но ведь вас никто не заставляет? :)
Подсчет ссылок — это уже дело программиста.
Не поверите — столько всего писал (в основном под *nix), начиная от заглушек на 80 порт и заканчивая счетчиками траффика — и все проблемы решаются «на раз». А strdup кстати — очень быстрая функция.
Горааздо быстрее, чем интерпретация байт-кода Явы.
Другое дело, если программист не знает архитектуры и языка, на котором пишет. Тогда ему просто необходим «умный» компилятор типо VB :)
Не все. Но большинство — таких.
> void
> 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>

Вложенность не ограничена. Можно писать как через рекурсию, так и через итерацию.
Это — базовый шаблон :)
Хотя иногда проще использовать статичные буфера и макросы для работы с ними.
Ну не знаю. Моей mx500 уже столько лет (и всяких квакодрочерств), а до сих пор как новая. Ну разве что скотч на ножках меняю раз в месяц :)
1. В нужных местах ставим const.
2. Учим ассемблер и понятие «страница памяти».
Оперируем страницами — mmap() в помощь.
3. Есть такая штука, как inline.
А ещё есть аргумент register.
4. И вообще, классы — это C++. Я лично пишу на чистом ANSI C :)
C++ это всякие new, delete и прочее. Не путайте.
P.S. DOM я может и не писал, но многоуровневые вложенные структуры с динамическим числом элементов и неограниченной вложеностью — писал. И знаете (!!111) — работает! И памяти жрёт в разы меньше (а сейчас в меня полетят минусы) «этой вашей» явы.
char *somefunc(int n) {
static char *buf = NULL;
if(buf) free(buf);
buf = malloc(n);
return buf;
}


А если Вы на «моих сях» не можете писать вменяемый код — это ваши персональные проблемы.
Я на них пишу со школы, вместо бейсика. И ни разу не пожалел.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity