LINUX.ORG.RU

Царю про 10к в надежде перевести дискуссию в конструктив

 ,


11

10

Я не думаю, что кого-то можно впечатлить принципиальной возможностью запустить 10к потоков для обслуживания клиентов. Когда говорят про встанет раком, имеют в виду неоправданную потерю производительности.

Если ты готов померять реальный перформанс, пиши, я налабаю на еполле аналоги твоих тестовых серверов, чтобы не ты один тратил своё время. Меня например больше в всего в контексте этого спора интересует, как поведёт себя сервер с 10к потоков например на 4 ядрах против еполльного на одном таком же ядре, в вариантах без локов и с.

Результаты исследования можешь запостить на ЛОРе и восстановить честь среди пятизвездочных 😝

Начало дискуссии где-то рядом в удаленных по инициативе какого-то наркомана.

PS скорее всего я отвечу не раньше ночи или следующего утра.

★★★★★
Ответ на: комментарий от www_linux_org_ru

Я бы тебе советовал снести свою потугу с кодом. Я решил пощадить тебя, но кто-то это может не сделать. И скоро точно появится разбор. Три, пока никто не увидел. И молись, чтобы никто и не увидел.

anonymous
()
Ответ на: комментарий от anonymous

9 строк, чтобы сократить 3

и это правильно, т.к. сокращаем 3 строки мы много раз, а 9 строк пишем 1 раз

Тонкую обёртку спастил у меня

нет, не спастил, а немного отрефакторил — для полных идиотов напомню, что я рефакторю ТВОЙ код

тебе по буквам повторить «Т-В-О-Й»?

и насрал дерьма сверху - молодец.

как видим, ты не можешь отличить дерьмо от чего-то полезного

fprintf( stderr, «start thread(%lu)\n», id )

тут соглашусь; я привык к плюсам, где таких ошибок не бывает, и дурацкие спецификаторы помнить и вставлять не надо

threads[id] = std::thread( worker, listen_fd, id );//просто феерично.

for(int id=0; id<n; ++id )// а это не менее.

что феерично?

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от anonymous

А по поводу анонимом - ну что поделать.

не грубить

Мне учётку заводить не дают

вверху кнопка «регистрация»

да и из под анонимама забанить пытаются

потому что ты вносишь неистовый объем помоев на форум?

Моя учётка живёт до тех пор, пока очередной пятизвёздочный не окажется в зоне риска. Приходится страдать.

Да, от неумения общаться действительно приходится страдать. Я сейчас тебе без никакого злого умысла и подтекста говорю - учись общаться. Почитай художественную литературу. Посмотри фильмы, я не знаю. Будь добрее что-ли? От того, что ты дофига умный лучше только тебе, человек будет на тебя агрессивно реагировать если ты будешь ему ТЫКАТЬ лицом в асфальт - попробуй лучше объяснить что не так.

Обрати внимание как тут писал смайлоаноним - с ним почему-то диких перепалок ни у кого не возникает. Я уж не говорю об обычных регистрантах которые помогают друг другу в техразделах.

anonymous
()
Ответ на: комментарий от www_linux_org_ru

и это правильно, т.к. сокращаем 3 строки мы много раз, а 9 строк пишем 1 раз

Написал ты это 1раз. Где остальные «много»?

тут соглашусь; я привык к плюсам, где таких ошибок не бывает

Ещё бы ты не согласился. Ну очередной зашквар.

что феерично?

Зря ты это написал - ой зря. До этого хоть мог попытаться отмазаться - ну как попытался. Я не знаю какой идиот в подобное поверил бы, но хотя бы мог попытаться.

anonymous
()
Ответ на: комментарий от www_linux_org_ru

Ы. Я особо не вникал в код, но я рекомендую не использовать для переменной-итератора тип int. Я всегда юзаю size_t, плюс это спасает от странных ситуаций в будущем при сравнении signed и unsigned.

anonymous
()
Ответ на: комментарий от anonymous

не грубить

Убогий потуги, жалкие и глупые. Никакой грубости в моей той теме не было.

вверху кнопка «регистрация»

Очередной бред.

потому что ты вносишь неистовый объем помоев на форум?

Очередной заявление рандомного нуля?

Да, от неумения общаться действительно приходится страдать. Я сейчас тебе без никакого злого умысла и подтекста говорю - учись общаться. Почитай художественную литературу. Посмотри фильмы, я не знаю. Будь добрее что-ли? От того, что ты дофига умный лучше только тебе, человек будет на тебя агрессивно реагировать если ты будешь ему ТЫКАТЬ лицом в асфальт - попробуй лучше объяснить что не так.

Вот ты пробалаболил на тему моего кода. Почему? Зачем ты вначале болтаешь, а потом думаешь?

Обрати внимание как тут писал смайлоаноним - с ним почему-то диких перепалок ни у кого не возникает. Я уж не говорю об обычных регистрантах которые помогают друг другу в техразделах.

Да мне насрать на то кто что писал и как регистранты лижут друг другу жопу.

Тебе уже объяснили в чём дело. Неуловимый джо неуловим не потому, что он как-то там особенно пишет. А по другой причине. И сравнивать мою и его сутиуации - не имеет смысла.

anonymous
()
Ответ на: комментарий от anonymous

Написал ты это 1раз. Где остальные «много»?

вау, царь оказывается считать не умеет

2-й раз это будет в клиенте

3-й раз это будет в еще одном сервере

и так далее — если мы пишем в таком стиле, приближенном к си

Зря ты это написал - ой зря. До этого хоть мог попытаться отмазаться - ну как попытался. Я не знаю какой идиот в подобное поверил бы, но хотя бы мог попытаться.

бугага

ну так рассказывай, что феерично-то, рассказывай, не стесняйся

тут такие простыни постил, такие простыни, а сейчас вдруг застеснялся

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от anonymous

Я бы тебе советовал снести свою потугу с кодом. Я решил пощадить тебя, но кто-то это может не сделать. И скоро точно появится разбор. Три, пока никто не увидел. И молись, чтобы никто и не увидел.

ржал под столом

ты че думаешь, что у меня чсв как у тебя что ли?

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

вау, царь оказывается считать не умеет

Покажи где второй. Я жду.

бугага

Ну я плохой человек. Да, я пользуюсь тем, что ты табуретка и вгоняю тебя во всё большую и большую жопу. Я не со зла. Но как тебя иначе научить. Учись. Обтекай.

Подсказку я тебе дал. Был бы хоть на что-то способным - ты бы всё понял, а так дуб дубом.

anonymous
()
Ответ на: комментарий от anonymous

Ок, понял, попытки общаться с тобой бесполезны. Людей у которых нет ни капли самокритики не в состоянии принять хотя-бы в рассмотрение выражение собеседника, не говоря уже о проверки на истинность.

// Могу подсказать хорошего доктора. Если ты из Москвы, напиши мне на eoperator at freebsd dot org

anonymous
()
Ответ на: комментарий от anonymous

Ы. Я особо не вникал в код, но я рекомендую не использовать для переменной-итератора тип int. Я всегда юзаю size_t, плюс это спасает от странных ситуаций в будущем при сравнении signed и unsigned.

а у меня как раз возникали проблемы «при сравнении signed и unsigned» из-за БЕЗзнакового итератора в цикле

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от anonymous

да ему и правда доктор не помешал бы, но, право слово, не хочется такого клоуна терять

я так никогда над чужим кодом не ржал, чего стоит sleep(10) в рабочих нитях, я и сейчас похохатываю

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от eao197

Срочно в тред требуются эксперты. Нужно объяснить собрату в чём он зашкварился. Сделай доброе дело, пожалуйста.

anonymous
()
Ответ на: комментарий от anonymous

Подсказку я тебе дал. Был бы хоть на что-то способным - ты бы всё понял, а так дуб дубом.

ну ты чего такой стеснительный стал, а? ты же мою ошибку типа видишь, давай, не стесняйся, глаголом жги сердца людей, гы-гы-гы-гы!!!

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

а у меня как раз возникали проблемы «при сравнении signed и unsigned» из-за БЕЗзнанового итератора в цикле

ну тогда ты сравниваешь что-то не то? о_О
мб ты меня не так понял. Проблемы в твоём случае возникали именно из-за самого факта сравнения, без акцента на кокретную переменную. Если ты сравниваешь с signed и unsigned, независимо от того где это происходит, то очевидно тебе нужно заранее про возможные варианты. К примеру, если я сравниваю size_t и ssize_t, то я сначала проверю ssize_t, а потом кастану в size_t.

Ну да ладно. Вообще есть отдельная статья на эту тему, у меня лично были проблемы из-за древнего говнокода и int в качестве итератора.

anonymous
()
Ответ на: комментарий от anonymous

Срочно в тред требуются эксперты. Нужно объяснить собрату в чём он зашкварился. Сделай доброе дело, пожалуйста.

вау! а это и правда царь?! или нет?

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от eao197

мимокрокодильный анонимус

Вызов write может вернуть меньшее значение, чем ему было указано.

В каких случаях? ЕМНИП, в таком: ты пишешь в файл, и у тебя заканчивается место. В случае же с сокетом за тебя всё решает сетевая подсистема, ну или на другом конце закрыли соединение и ты получил EPIPE

А вот ТИПИЧНО подобная ситуация возникает с read(). Вот там да, надо вызывать повторно чтобы добрать недостающие байты. Это происходит повсеместно.

anonymous
()
Ответ на: комментарий от www_linux_org_ru

мимокрокодильный анонимус

линк на статью давай, это я всегда за

завтра когда приду домой - поищу, вроде как в закладках где-то было. Не помню деталей, но лично я боюсь попасть в просак из-за UB при integer overflow, потому и использую size_t, и пишу код так, чтобы сравнивались всегда беззнаковые целые.

anonymous
()
Ответ на: комментарий от anonymous

Покажи где второй. Я жду.

дислексия тебя совсем замучила? и склероз тоже? или непроходимая тупость?

ведь тяжело тебе наверно...

я же уже написал — в К_Л_И_Е_Н_Т_Е будет 2-й раз, вот тут: Царю про 10к в надежде перевести дискуссию в конструктив (комментарий)

так понятно? или все еще нет?

вот тебе Т_В_О_Й код клиента

int connect_to(in_addr_t addr, uint16_t port) {
  sockaddr_in saddr{};
  saddr.sin_family = AF_INET;
  saddr.sin_port = htons(port);
  saddr.sin_addr.s_addr = htonl(addr);

тут будет 2-й раз

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от anonymous

Зачем два аргумента? Чтобы в месте, где вызывают не использовать оператор умножения? А потом внутри функции проверять не ввёл ли кто-то 0? о_О

Чтобы, если потребуется, можно было бы запилить нормальную проверку на переполнение внутри функции.

if (mem == NULL) {
    perror("Out of memory");
    abort();
}

А если у тебя попросят 0 объектов? malloc вернёт NULL, и ты скажешь “Out of memory: Out of memory” (см. семантику perror) и абортнешься? Фигня тут у тебя.

static inline int make_nonblock(int fd)
{
    return fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK) < 0);
}

Но мне нужно сохранить errno того fcntl’а, который сфейлится первым, а в этом выражении неочевидно, что это происходит. А вообще, setting fd non-blocking mode never fails.

а вот это вообще жестяк:

enum { BUFSZ = 4 * 1024 };

Чем тебе не нравится enum?

там половина портянки выглядит как ptrtostruct->field, в чём прикол этого макроса?

В разделении уровней и инкапсуляции, очевидно же.

Дальше код читал по диагонали. Выглядит слегка «лапшично». Ну и блин. Опять наследие сишников старых пердунов:

return 1;

вместо

return EXIT_FAILURE;

Но есть же соглашение: 2, если invalid usage; 1, если другая ошибка. Зачем мне писать EXIT_FAILURE, если 1 короче и я уверен, что “1” раскроется в “1”?

shdown
()
Ответ на: мимокрокодильный анонимус от anonymous

В каких случаях? ЕМНИП, в таком: ты пишешь в файл, и у тебя заканчивается место. В случае же с сокетом за тебя всё решает сетевая подсистема, ну или на другом конце закрыли соединение и ты получил EPIPE

а если случился временный network jam, а у ядра не хватает write буферов?

www_linux_org_ru ★★★★★
()
Ответ на: мимокрокодильный анонимус от anonymous

В каких случаях?

ЕМНИП, у системы есть связанный с сокетом SNDBUF, в котором данные лежат до того, как уйдут в сеть. Если объем данных во write оказывается, больше, чем свободное место в SNDBUF, то ОС запихивает в SNDBUF только часть данных из write.

Если другая сторона не успевает вычитывать данные, то SNDBUF довольно быстро забивается.

eao197 ★★★★★
()
Ответ на: мимокрокодильный анонимус от anonymous

Нет, при сравнении не-указателей UB быть не может, там просто всё кастуется к самому-большому самому-unsigned (т.е. всё кастуется к unsigned тогда и только тогда, когда хотя бы один из сравниваемых unsigned) типу.

shdown
()
Ответ на: комментарий от www_linux_org_ru

переписать на плюсах покрасивее

Получаешь приз «лучшая шутка года»

timdorohin ★★★★
()
Ответ на: комментарий от shdown

Чтобы, если потребуется, можно было бы запилить нормальную проверку на переполнение внутри функции.

Оу. Признаюсь честно - тут не подумал о таком варианте. Привык, что все аномальные значения извне (т.е. runtime) проверяются заранее, а все compile-time проверяются компилятором с -Wall и -Wextra...
Просто изначально с т.з. 3-й стороны это выглядело странно, как будто бы ты хочешь избежать умножения.

А если у тебя попросят 0 объектов? malloc вернёт NULL

именно. Мне не нужно лишний раз выполнять проверку - malloc проверяет в любом случае и по стандарту

ты скажешь “Out of memory: Out of memory” (см. семантику perror)

Ну, вообще тут суть рефакторинга была в том, чтобы выбросить ошибочное событие на perror(), а контекст на аргумент perror(). В результате выглядеть будет странно, возможно следовало бы просто заменить строку на что-то более адекватное. Изначально думал вообще fputs() взять, но не люблю я эту функцию...

Но мне нужно сохранить errno того fcntl’а, который сфейлится первым, а в этом выражении неочевидно, что это происходит.

По какой причине может упасть первый вызов? Я никаких причин кроме как EBADF не вижу. Если так и случится, 2-й вызов упадёт с той же ошибкой.

setting fd non-blocking mode never fails

можно ссылку на референс? Я вообще привык проверять return value у системных вызовов POSIX в любых случаях, ибо мало ли. Если проверять, то проверять до конца - вдруг кто-то юзнёт эту функцию на дескрипторе, который относится к обычному файлу (regular file)? Если ты знаешь на что используешь эту функцию, то может тогда и вообще проверки не нужны?

Чем тебе не нравится enum?

А чем тебе не нравится #define?

В разделении уровней и инкапсуляции, очевидно же.

Можешь раскрыть тему, пожалуйста? Ну, я имею ввиду раскрыть мысль подробнее.

Зачем мне писать EXIT_FAILURE, если 1 короче и я уверен, что “1” раскроется в “1”?

Это, опять таки, наследие старых лет. Затем писать, что это MAGIC NUMBERS. Если используется EXIT_FAILURE, то сразу видно что имеется ввиду, человеку не нужно думать лишний раз что означает 0 и -1. Да, это занимает несколько секунд, но если по всему коду вот такие вот 0 и 1, это совсем беда... Я не единожды читал всякие бяки с времён K&R C и C89, переполненные 0, -1, 1. Не хочу что-бы кто-то подавал пример будущим поколениям.

anonymous
()
Ответ на: комментарий от shdown

мимокрокодильный анонимус

Нет, при сравнении не-указателей UB быть не может, там просто всё кастуется к самому-большому самому-unsigned (т.е. всё кастуется к unsigned тогда и только тогда, когда хотя бы один из сравниваемых unsigned) типу.

Наверное, пришла мне пора написать книгу «C bad practice» с примерами, по аналогии и в противовес знаменитой книге «Perl best practices» :D

anonymous
()
Ответ на: комментарий от eao197

мимокрокодильный анонимус

Завтра тест напишу - аж самому интересно стало. Спс за наводку, кстати, если это именно так - буду знать!

anonymous
()
Ответ на: комментарий от shdown

по-хорошему для этого мне надо внимательно читать, но речь идет хотя бы о замене кода

    if( syscall(четотам) < 0 ) {
        perror("something bad");
        return/break/continue;
    }

на просто

    syscall(четотам);

с возможным исключением и ловлю исключения в правильном месте

еще для *аллоков может пригодится шаблон — но это опять смотреть надо внимательно

www_linux_org_ru ★★★★★
()
Ответ на: мимокрокодильный анонимус от anonymous

Наверное, пришла мне пора написать книгу «C bad practice» с примерами, по аналогии и в противовес знаменитой книге «Perl best practices» :D

напишешь хотя бы просто примеры — обязательно напиши мне (мое мыло в профиле)

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от www_linux_org_ru

мимокрокодильный аноним

Я лично привык к блокам с вариантом №1. Может тебе №2 нравится больше потому, что ты больше на плюсах писал? ИМХО тут дело привычки а не стиля. Если писать чисто на плюсах, то да - там вам и исключения и шаблоны, а если на C...

anonymous
()
Ответ на: комментарий от eao197

Ты чуеш чем пахнет? Давай я в тебя верю.

anonymous
()
Ответ на: комментарий от www_linux_org_ru

мимокрокодильный анонимус

напишешь хотя бы просто примеры — обязательно напиши мне (мое мыло в профиле)

Вообще, у меня давно была парочка... м... тезисов. Они больше похожи на смесь советов с интересными практиками и случаями. Если интересно - можем пообщаться, мб что-то да забацаем.

З.Ы. У тебя в профиле жаббер...

anonymous
()
Ответ на: мимокрокодильный аноним от anonymous

№2 объективно лучше (хотя бы потому, что «something bad» может почти однозначно соответствовать syscall-у); некоторые даже ваяют свою макросню по аналогии с исключениями (пример не покажу, сорри)

... за исключением того, что исключения в плюсах дико тормозные

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

мимокрокодильный анонимус

Спс. Отписался.

З.Ы. Не думаю, что в этом треде еще стоит что-то писать. По крайней мере я не буду. Все какашки которые можно было метнуть друг в друга все кто хотел уже метнули.

anonymous
()
Ответ на: комментарий от anonymous

именно. Мне не нужно лишний раз выполнять проверку - malloc проверяет в любом случае и по стандарту

Щито???

http://man7.org/linux/man-pages/man3/malloc.3.html

If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free().

Если у тебя попросят 0 (ноль) объектов, а malloc вернёт NULL, то ты абортнешься (ещё и напечатаешь какую-то фигную — malloc-то errno не установит в таком случае) — а не следовало бы.

рефакторинга

Какого ещё рефакторинга?

чтобы выбросить ошибочное событие на perror(), а контекст на аргумент perror().

Не понимаю.

Изначально думал вообще fputs() взять, но не люблю я эту функцию...

Чего. Чем fprintf хуже fputs.

По какой причине может упасть первый вызов? Я никаких причин кроме как EBADF не вижу. Если так и случится, 2-й вызов упадёт с той же ошибкой.

Ты полагаешься на то, что

fcntl(bad_fd, F_SETFL, bad_value)
упадёт с EBADFD, а не с EINVAL. Это, конечно, так, но это неочевидно.

можно ссылку на референс?

https://github.com/strace/strace/blob/master/strace.c#L467 :)

Я вообще привык проверять return value у системных вызовов POSIX в любых случаях, ибо мало ли.

Я тоже.

А чем тебе не нравится #define?

Тем, что компилятор всё-таки понимает, что это константа, а не просто кусок текста. В качестве шутки:

#define X -1
enum { Y = -1 };

int main() {
    int a = 5 X; // ok
    int b = 5 Y; // error
    return 0;
}

Можешь раскрыть тему, пожалуйста? Ну, я имею ввиду раскрыть мысль подробнее.

sal_* и srv_epoll_run не должны полагаться на поля Datum, и если я захочу изменить их, то я изменю и макросы datum_{fd,ptr}. Вот и всё.

Это, опять таки, наследие старых лет. Затем писать, что это MAGIC NUMBERS. Если используется EXIT_FAILURE, то сразу видно что имеется ввиду, человеку не нужно думать лишний раз что означает 0 и -1. Да, это занимает несколько секунд, но если по всему коду вот такие вот 0 и 1, это совсем беда... Я не единожды читал всякие бяки с времён K&R C и C89, переполненные 0, -1, 1. Не хочу что-бы кто-то подавал пример будущим поколениям.

Фигня. Эти EXIT_SUCCESS/EXIT_FAILURE нужны для других платформ, на линуксе — 0 — это sucess, всё остальное — failure.

shdown
()
Ответ на: комментарий от anonymous

P.S.

Это, опять таки, наследие старых лет. Затем писать, что это MAGIC NUMBERS. Если используется EXIT_FAILURE, то сразу видно что имеется ввиду, человеку не нужно думать лишний раз что означает 0 и -1. Да, это занимает несколько секунд, но если по всему коду вот такие вот 0 и 1, это совсем беда... Я не единожды читал всякие бяки с времён K&R C и C89, переполненные 0, -1, 1. Не хочу что-бы кто-то подавал пример будущим поколениям.

…но в проектиках я всё-таки использую EXIT_{SUCCESS,FAILURE}: https://github.com/shdown/luastatus/blob/master/luastatus/luastatus.c#L317

shdown
()
Ответ на: мимокрокодильный анонимус от anonymous

если ты отлистаешь несколько страниц назад, то там был разговор про скорость переключения обычных и зеленых тредов, затем о влиянии tlb-miss-ов при 10К...100К тредов и еще может о чем-то

правда из-за галдежа царя тут конечно кпд низкий

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от shdown

мимокрокодильный анонимус

done

anonymous
()
Ответ на: комментарий от vzzo

Ты про libev? или есть что-то более высокоуровневое?

Если libev, то не засчитано. Я писал за еду курсач по libev. Писать под неё далеко не тривиально. Ну т.е. курсач на тяп-ляп сделать можно было, но сделать все идеально — очень непросто.

В go же ты тупо пишешь код в лоб и он, внезапно, асинхронный.

И, внезапно, рутина может быть приостановлена прямо посередине (во время вызова другой функции или при runtime.Gosched(). Такое, насколько я понимаю, не доступно libev-каллбекам.

derlafff ★★★★★
()
Ответ на: комментарий от derlafff

Ты про libev? или есть что-то более высокоуровневое?

Нет, про boost::fibers (которые в связке с boost::asio как раз там и делают: прячут epoll и зеленые нити под капотом синхронного кода). Под си есть libtask с какими-то странными потугами сделать сеть.

vzzo ★★★
()
Ответ на: комментарий от eao197

При чем здесь статья c10k времен третьего пентиума?

ты бы посмотрел на тему ветки вместо того чтобы оффтопить

anonymous
()
Ответ на: комментарий от www_linux_org_ru

и в каких случаях одностраничный гвард не помогает?

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

anonymous
()
Ответ на: комментарий от www_linux_org_ru

как же 1 нить умудрялась весить 2-3 кб

информация о ней (в частности, так лелеемых eao197 регистрах) в эфире хранится?

anonymous
()
Ответ на: комментарий от eao197

Я, например, не в курсе, что происходит, если accept для одного и того же серверного сокета параллельно вызывается на нескольких нитях

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

я тебе расскажу: один поток забирает сокет, остальные получают ошибку.

anonymous
()
Ответ на: комментарий от www_linux_org_ru

так там линукс просто портил эти входные буфера

это тебе попку какой-то хипстер попортил. проверяй возвращаемые значения.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.