• Dorif анонс posix Unix Привет пользователям UNIX-like систем!

    Я пишу небольшой набор открытых и свободных coreutils (небольшой проект, не такой фичастый, как GNU coreutils) для POSIX-совместимых ОС. Проект называется escu(сокращение от Extremelly Small CoreUtils). Писать начал, когда пожелав выучиться системному программированию по исходникам GNU Coreutils, но не смог разобраться в spaghetti code и решил их переписать согласно спецификациям The OpenGroup.

    Уже есть утилиты: basename, chroot, dirname, false, head, link, ln, logname, ls, mkfifo, mv, pwd, test, true, tty, uname, unlink, yes. Многие из них уже полностью POSIX-совместимы. Я использую системные вызовы для снижения накладных расходов, а также стараюсь писать максимально простой код для облегчения понимания новичками.

    Проект нацелен на максимальную переносимость, поэтому при написании используются только возможности стандартной библиотеки языка C, а для сборки будут использоваться только POSIX-совместимые make, компилятор языка C и командная оболочка.

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

    Комментарии, предложения и патчи приветствуются!

    Исходный код: github.com

Replies (186)

  • @Dorif, Любопытно. Пакетировать не забывай.
  • @Dorif, Как насчет busybox?
  • @Dorif, Зачем нужно это говно, когда есть plan9port, busybox и heirloom?
  • @Dorif, Алсо, выброси свой мейкфайл и напиши нормальный.
  • @Dorif,
    Я пишу небольшой набор открытых и свободных coreutils (небольшой проект, не такой фичастый, как GNU coreutils)
    Такой стиль нарочно выбрал? :3
  • @Annoynimous, Неа. А что со стилем?
  • @vt, Ну, там код понятнее, но всё ж они тож страдают некоторыми "болезнями" GNU. Пример: исходники false и, если мне не изменяет память, — uname
  • @Dorif, Точно нарочно, не отнекивайся.
  • @Annoynimous, Не, реально не понимаю — что не так? Одному тонко, другой про стиль переспрашивает? Кто-то скажет, что не так?
  • @Dorif, Hello everybody out there using minix —

    I’m doing a (free) operating system (just a hobby, won’t be big and
    professional like gnu) for 386(486) AT clones. This has been brewing
    since april, and is starting to get ready. I’d like any feedback on
    things people like/dislike in minix, as my OS resembles it somewhat
    (same physical layout of the file-system (due to practical reasons)
    among other things).
  • @Annoynimous, Ввиду простоты кода — в образовательных целях, например. Ввиду компактности и нересурсоёмкости — может делить нишу с бизибоксом и подобным. Т.к. всё ж стараюсь делать полнофункциональным — может и в установленных системах юзаться(скорее в BSD, ибо лицензия CDDL).
  • @Dorif, Plan 9 простой и компактный. Heirloom стандартный и простой. Ты на них вообще смотрел?
  • @Annoynimous, Честно говоря — нет, ибо в выдаче на ohloh их не было.
  • @Annoynimous, Всё, вкурил. Честно: не специально.
  • @Veresk, Ну, хочу потом сделать как минимум deb и rpm пакеты. Ещё предложения есть какие-то в плане пакетов?
  • @Dorif, Странный выбор поисковика. В гугле первым линком на coreutils alternatives есть busybox и heirloom.
  • @Annoynimous, Ну, просто ohloh сразу примеры кода выдаёт — удобно.
  • @Dorif, Пока полного комплекта условно-рабочих тулз нет пакетировать рано. А в чруте можно и так пускать.
  • @v-add-im, Ну, это понятно. Я ж говорю — "хочу сделать", а не "сделал".)
  • @Dorif, зачем пилить бизибокс или хеирлум, нужно делать свой велосипед!
  • @Dorif,
    выучиться системному программированию
    лучше бы ты тогда libc взял переделывать. в велосипединии cat, ls нет системного программирования.
  • @Dorif, а что мешает присылать им пожелания и патчи?
  • @vt, У них уже устоявшееся апи и стиль кодирования — вряд ли они его изменят ради пожеланий кого бы то ни было
  • @4DA, Ошибаешься. Создание базовых утилит(корутилзы), командных интерпретаторов, интерпретаторов и компиляторов вообще, текстовых редакторов, пейджеров и т.п., что must have каждый UNIX — это тоже подпадает под системщину. Не хочу сразу начинать с самых низкоуровневых частей системного программирования — тогда наверняка я напишу такую хрень, что самого оторопь возьмёт. Лучше я пойду по нисходящему методу — от баовых утилит, к текстовым редакторам, интерпретаторам и т.д.
  • @Dorif, я вижу, у тебя какое-то особенное понимание. Ты конечно молодец — поместил интерпретаторы и компиляторы в один ряд с текстовыми редакторами. С хрена ли ты решил, что текстовый редактор — системная программа?
  • @4DA, Так оно рассматривалось в учебнике, который мне попался. Претензии — к автору.
  • @Dorif, Идем в википедию и просвещаемся: "System software (or systems software) is computer software or an operating system designed to operate and control the computer hardware and to provide a platform for running application software."
  • @Dorif, что за учебник?
  • @Dorif, Как-то в начале 2000-х видет проект дистрибутина-на-дискете, где кореутилы были переписаны на шелле. Внезапно, оно даже работало.
  • @4DA, piter.com Рассматриваются аспекты написания екстовых редакторов, командного интерпретатора и т.п.
  • @4DA, Ага. Но корутилзы тоже относятся к этой категории. Ибо содержат часть утилит, не встроенных в командный интерпретатор и необходимых для работы некоторых шелл-скриптов, являющихся, в свою очередь, приложениями.)
  • @xl0, На шелле? Ого. Эт сильно. А чего за дистр такой? Вспомнишь может? Хочется потыкать.
  • @Dorif, ну автор решил рассказать как делать текстовые редакторы и получше места не нашлось как сунуть эту в учебник по СП.
    а ты и уши развесил.
  • @Dorif, Корутилзы никоим образом не взаимодействуют с железом.
  • @Dorif, и чо? для работы gmplayer нужен mplayer. ты ведь не скажешь, что mplayer — системная программа?
  • @4DA, Потому что наличие mplayer в отличие от того же kill в системе необязательно.
  • @Dorif, Наличие kill тоже.
  • @Dorif, Алсо, в какой системе?
  • @Annoynimous, POSIX почитай.
  • @Dorif, А, то есть всё, что описывает POSIX, — объект системного программирования?
  • @Annoynimous, Совместимой с POSIX, то есть: юникс-подобной.
  • @Dorif, Plan 9 является юникс-подобной системой, но никоим образом не совместима с POSIX.
  • @Annoynimous, Он описывает базовые утилиты, наличие которых обязательно в любой системе UNIX и за счёт которых обеспечивается некоторая совместимость между ними. Т.е стандартизирует часть "платформы для запуска плиложений". На голом ядре ты не много запустишь.
  • @Dorif, И причём тут системное программирование?
    На голом ядре я дохуя всего запущу. Например, любой статически слинкованный бинарник.
  • @Dorif, причем здесь голое железо. твои cp, less, kill — это аналоги диспетчеру файлов, и диспетчеру процессов винды, который вызывается по ctrl-alt-del. Диспетчер файлов и процессов является системной программой? Нет. Это программы для конечного пользователя.
  • @Annoynimous, Plan9- post-UNIX. Это другое. К тому же: частично всё же совместима. Плюс: SUS и POSIX на данный момент — одно и то же.
  • @Dorif, Это не делает её не-юникс-подобной ОС.
  • @Dorif, Ну и да, Plan 9 в гораздо большей степени UNIX-подобная, чем какой-нибудь GNU/Linux, начиная с философии и заканчивая исходным кодом.
  • @Annoynimous, Делает, ибо не совместима с SUS/POSIX. А право называться юникс-подобной имеет система, соответствующая этим стандартам.
  • @Dorif, Какое-то странное у тебя определение. Из той же книжки взял?
    A Unix-like (sometimes referred to as UN*X or *nix) operating system is one that behaves in a manner similar to a Unix system, while not necessarily conforming to or being certified to any version of the Single UNIX Specification.
  • @Annoynimous, Если мне не изменяет память, подобность или не подобность определяется соответствием SUS/POSIX, а не философией и т.д.
  • @Annoynimous, Блин, я уже говорил, что Single Unix Specification и POSIX сейчас одно и то же. Читай сайт The OpenGroup
  • @Dorif, Ты вообще /51 прочитал, или из знакомых слов только SUS увидел?
  • @Dorif, научись отличать "подобность" от "соответствия".
  • @Annoynimous, Plan9 ведёт себя как юникс только в очень ограниченном плане. Если это считать юникс-подобной ОС, давайте и венду признаем за неё, чё. Причём без UNIX Services for Windows
  • @Dorif, в юникс-подобной две концепции — 1. все есть файл. 2. комбинация мелких утилит, KISS. Plan9 попадает под это определение. Венда попадает под первое. (Именованые объекты в ядре задаются иерархическими путями по типу файлов + ioctl + DeviceIOControl)
  • @Dorif, Твоя проблема в том, что живого юникса ты скорее всего не видел (разве что солярку тыкал какую-нибудь). Видимо, под юниксом ты подразумеваешь линух или фрибсд. Тогда конечно, p9 ведет себя по-другому.
  • @4DA, Видел. Solaris, UnixWare, OS X, на эмуляторах тыкал SYSV, TENEX. С соляркой и макосью даже работал долгое время.
  • @4DA, Так и МС-ДОС можно юникс-подобным признать
  • @Dorif, да. в чем проблема?
  • @4DA, TYPE FILE.TXT > PRN — отправить файл на принтер.
  • @4DA, Ну, вперёд! Накидай туда же CP/M, и всё, что ранее написано.
  • @4DA, Это хак на уровне интерпретатора, насколько я помню. Как в баше /dev/tcp вместо полноценной файловой системы, описывающей взаимодействия по ip, как в Plan 9.
  • @4DA, Все системы оперируют файлами. и? Соответствие одному критерию не сделает систему юникс-подобной. Она должна соответствовать нескольким требованиям
  • @Dorif, почему должна соответсвовать всем?
  • @Dorif, а чего ты удивляешься? юникс оказал достаточно сильное влияние на оси. непохожие на юникс системы, которые я припоминаю — os/360 и VMS
  • @4DA, Я сказал нескольким. Больше, чем одному.
  • @Annoynimous, это не важно :3. юникс — это не внутренности, это интерфейсы, идеи и философия.
  • @4DA, VMS как раз сертифицирована на соответствие POSIX. Её как раз можно юникс-подобной считать.
  • @4DA, О том-то и речь, что в интерфейсе ФС, предоставляемом программам, нет никакого PRN.
  • @4DA, По The OpenGroup как раз наоборот. Юникс — это внутренности. И они подробно эти внутренности расписывают. А я — реализовываю, что могу.
  • @Annoynimous, Смотря какие утилиты. Некоторые из них взаимодействуют. Почитай у The OpenGroup. К тому же: корутилзы формируют часть той самой платформы для запуска приложений.
  • @Dorif, Например, какие?
    Ты "and" в определении пропустил, я полагаю.
  • @Dorif, херню несешь. VAX/VMS не был сертифицирован
  • @Dorif, чо? какие внутренности? opengroup описывает интерфейсы подсистемы VM? шедулера? дискового кеша?
  • @Dorif, тебе уже сказали, что можно запустить любую программу без coreutils. платформа здесь имеет другое значение.
  • @Annoynimous, Компиляторы, ассемблер, дизассемблер, — все они зависимы от железа.
  • @4DA, Вперёд! Запусти на голом ядре без шелла, инита и т.п. приложение.) Как ты это делать будешь, интересно?)
  • @Dorif, они не входят в coreutils.
  • @Dorif, Щто.
  • @Dorif, init=/foo/bar/baz/a.out
  • @Dorif, Они могут работать в голом ваакуме.
  • @Dorif, Алсо, у тебя скобки не сбалансированы.
  • @fmap, И без компа тоже, да?)
  • @Annoynimous, Без инита. Инит до systemd представлял собой набор шелл-скриптов и утилит.
  • @Dorif, Это и есть без инита.
    Инит до systemd представлял собой набор шелл-скриптов и утилит.
    Ты совсем наркоман?
  • @Dorif, ты чо поехавший? c initramfs не путаешь?
  • @Dorif, сходи посмотри что такое /sbin/init
  • @4DA, В Понимании GNU -да. Но они относятся к утилитам, которые обязан иметь любой юникс по версии The OpenGroup
  • @4DA, Может быть. Когда я читал LFS я понял, что система инициализации(инит) представляет собой набор утилит и скриптов. Например, в процессе инициализации потребуется подгорузить модуль ядра — нужна утилита, которая это сделает. Или скрипт.
  • @Annoynimous, А, забыл. я ж сам так делал для recovery опции в загрузчике. Но если нет командного интерпретатора — как собиаешься запустить ещё какую-нибудь программу, если понадобится? Перезагружать с новой опцией? А чем ты эту опцию укажешь? Текстовый редактор запустить и отредактировать нужный конфиг не можешь — тебе недоступен командный интерпретатор.
  • @Dorif, Что сказать-то хотел?
  • @Dorif, Алсо, мне в моём KDE4 и без командного интерпретатора неплохо живётся.
  • @Annoynimous, Что ты будешь делать, если захочешь запустить другую программу? На голом ядре. Без интерпретатора, корутилзов, инита, текстовых редакторов. Как ты укажешь новую опцию init=/foo/bar ? И ЧЕМ ты её укажешь?
  • @Dorif, Интерпретатором команд в загрузчике.
  • @Dorif, Сниму штаны и убегу. А какого ответа ты ждал?
  • @Dorif, это не имеет отношения к рассматриваему вопросу. корутилзы — не системный софт. любую программу можно запустить и без них.
  • @xl0, А чем ты поставишь загрузчик? У тебя вообще ничего, кроме самозагружающегося ядра нет. *До версии 2.6 Линукс имел встроенный в ядро загрузчик.
  • @Dorif, ты чего пытаешься доказать? что без корутилз в современном линуксе невозможно работать? да, невозможно. ждем гомосексуального поражения ^W^W доминации systemd.
  • @Dorif, С перфоленты.
  • @xl0, Давно ты видел исправную читалку перфолент? Я — в 1995, когда мама мне "Мински" тогда ещё работавшие показывала.
  • @4DA, Я пытаюсь втолковать вам то, что ОС — не не голое ядро. Это программный комплекс. Включающий в себя базовое пользовательское окружение. Иначе это бы звалось не операционной СИСТЕМОЙ, а операционной ПРОГРАММОЙ или планировщиком системного времени(OS/360 ближе к планировщикам, чем к ОС, всё, что было до неё вообще под ОС никак не подпадает).
  • @Dorif, да они всё это и без тебя знают, лол.
  • @ulidtko, И хули тогда тупят? Ибо если рассматривать операционные системы, то на системном уровне находится и базовое пользовательское окружение. Ибо без него система представляет собой просто ядро, висящее в вакууме.
  • @Dorif, Что-то уже не гуглится.
  • @xl0, Всё равно — эт сильно было. Это ж нужно было писать постоянно с оглядкой на то, чтобы использовать в скрипте только встроенные в командный интепретатор команды.
  • @Dorif, А чего не на лиспе/плюсах/хаскелле/вотевер? Ещё один бизибокс/план9порт и ещё что-то там. Не нужно
  • @Dorif, а я это утверждал? ОС — не голое ядро. Но то, что ты пишешь — не системный софт.
  • @ArtifTh, 1) Я пишу на том, что знаю.
    2) Для написания корутилзов высокоуровневые языки, ИМХО, лучше не юзать, тем более — их компиляторы в стандарт не входят.)
  • @4DA, Это часть пользовательского окружения.
  • @Dorif,
    на системном уровне находится и базовое пользовательское окружение
    вот ведь бред, а. Вот скажи мне. Если я вместо баша буду пускать mc, то значит mc находится на системном уровне?
  • @Dorif, Бесполезным чем-то занимаешься.
  • @ArtifTh, Самообразование бесполезным не бывает
  • @Dorif, что толку опенсорс коммунити до твоего самообразования, если пользы от него — ноль?
  • @Dorif, Иди на курсеру запишись.
  • @4DA, А он тебе обеспечит всё то, что обеспечит баш?)
  • @4DA, А зачем тогда вообще что-то делать?
  • @Dorif,
    лучше не юзать
    хотелось бы услышать аргументацию.
  • @4DA, Вопрос лишён смысла. Какую аргументацию я могу дать на бессмысленный вопрос?
  • @Dorif, Кореутилсы не нужны, настоящие мужчины (вроде меня) пишут ядра — github.com
  • @xl0, Пиши. Удачи тебе в этом!
  • @Dorif, Это было в 2004-2005. ж)
  • @Dorif, да.
  • @xl0, а ты случаем jarios не пилил?
  • @4DA, Нет, но работал в конторе с Алфейксом. :P
  • @xl0, ы
  • @4DA, И возможность запуска шелл-скриптов? *Баша и другого командного интерпретатора у тебя нет.
    И кстати, с той же англовики, та же статья про системное ПО: It also provides a platform to run high-level system software and application software. Высокоуровневое ПО — это, например, шелл-скрипты. Без корутилзов они будут ограничены небольшим набором команд, встроенных в интерпретатор. И даже en.wikipedia.org и ru.wikipedia.org так ии иначе утверждают, что базовые утилиты. формирующие пользовательское окружение относятся к системному ПО, ибо без них работа юзера была бы очень неудобной или невозможной
  • @Dorif, а может я не хочу пускать шелскрипты и у меня systemd? кроме того, чото не видел у тебя в исходниках интерпретатора или компилятора.
  • @4DA, В общем: я продолжаю то, что начал и чхать хотел на то, нужно оно или нет и к чему относится.
  • @4DA, В некоторые интерпретаторы не встроен ls — просмотри содержимое директории без него.
  • @Dorif, да продолжай, кто тебе мешает. просто не нужно абузить общепринятые термины.
  • @Dorif, Точнее — без корутилзов, что предоставят тебе этот ls
  • @4DA, Общепринятые термины даже в англовики от статьи к статье различаются. Причём таким образом, что этот "and" периодически заменяется на "or". Так что разберитесь сначала кем и где термины общеприняты.
  • @Dorif, Критика вызвана тем, что ты, возможно непроизвольно, представил свой проект как что-то, имеющее практическую ценность. А так, конечно пиши, если тебе это приносит удовольствие.
  • @Dorif, есть терминология, а есть здравый смысл. так вот, называть ls, cat, less "системным ПО" его лишено.
  • @xl0, Люди, что вы пытаетесь решать за других, что представляет, а что — нет, практическую ценность? Если это конкретно сейчас практической ценности не приносит — это не значит, что оно не принесёт оной в будущем.
  • @4DA, Помнится, кто-то меня убеждал в том, что имеет смысл таки терминология. Таким образом вы меняете тезис по ходу рассуждения в обход всех норм здравого смысла.
  • @Dorif, я про то, что неоднозначности в терминологии следует разрешать при помощи здравого смысла. например "to provide a platform".
  • @4DA, Ещё раз: платформа — это не набор "ядро, ассемблер, компилятор", платформа — это то, что позволит запустить и поддерживать работу чего-то полезного на этом ядре, позволять работать компилятору и ассемблеру. Кстати: ассемблер и компилятор — это только утилиты, имеющие непосредственную связь с железом А попробуйте запустить на голом ядре динамически слинкованную прогу — не получится. Линковщика нема. Попробуйте отладить или прочтать дамп без дебаггера, шестнадцатеричного или текстового редактора — тоже облом. Примеры можно продолжить.
  • @Dorif, Даже написать прогу без хотя бы командного интерпретатора и cat не получится. Файл исходного кода сам компилятор не создаст.
  • @Dorif, Подписался
  • @Dorif, можно продолжить: попробуйте "выйти во вконтактик без веббраузера". ты мешаешь в кучу системное и не системное по.
  • @Dorif, ты повторяешься. что-то полезное можно сделать и без твоих корутилзов. весь вопрос в удобстве.
  • @4DA, Было время, когда что-то полезное делали вообще набором машинных комманд вручную. Теоретически даж с голым ядром поизвращаться можно и что-то родить. Но для этого и существует базовое пользовательское окружение, состоящее, кроме средств разработки ещё из командного интерпретатора, корутилзов и текстового редактора
  • @Dorif, и? platform = набор системных библиотек и программ (кстати и линкер сюда же), которые абстрагируют железа и предоставляют сервисы ОС, и к которым прикладные программы могут обращаться для своей работы. твой редактор и корутилзы (без баша и средств разработки) — обычные прикладные программы.
  • @Dorif,
    Я использую системные вызовы для снижения накладных расходов
    Чё.
  • @gelraen, Расходов системных ресурсов. Памяти, процессорного времени и т.д.
  • @Dorif, а как можно не использовать системные вызовы для взаимодействия с внешним миром?
  • @gelraen, Никак. Но есть разница — использовать чистые системные вызовы или функции типа printf, puts, getchar и т.д. Простой системный вызов сделает ту же работу, но с меньшими расходами ресурсов.
  • @Dorif, а, вот оно что.
  • @Dorif, Не факт что с меньшими.
  • @Dorif, т.е. по ходе дела навелосипедится ещё и половина libc
  • @fmap, Ну, можно потом сравнительный тест устроить. Но по идее должно быть так.
  • @gelraen, Зачем? Системных вызовов есть дохрена и трошки, чтобы используя почти только их не велосипедить.
  • @Dorif, ждем твой фирменный многопоточный malloc и графиков его отсоса либсишному.
  • @Dorif, $ time ./a.out | head -100000 > /dev/null # где a.out — результат компиляции yes.c с -O3

    real 0m0.064s
    user 0m0.007s
    sys 0m0.117s
    $ time yes | head -100000 > /dev/null

    real 0m0.008s
    user 0m0.005s
    sys 0m0.006s
  • @Dorif, Причина — системный вызов (очень затратная операция) на каждую строку вместо буферизованного вывода с помощью fputs/putchar.
  • @Annoynimous, Я тоже сразу это вспомнил.
  • @Dorif, Пока не читал дискуссию.
    Но: тебе ужэ объяснили, что ты дебил по жызни и код у тебя как у идиота, что такой херни написано ужэ 100500 экземпляров, что она нафиг никому не нужна дажэ в первом и вообще лучшэ бы ты учил 1С, а не маялся дурью?
  • @Dorif, А если еще и в один бинарник упакуешь на манер бизибокса, то вообще красота будет, ибо в бизибоксе местами — набор обрубков.
  • @Dorif, github.com
    Это чё, реально считается хорошим стилем кода?
  • @tzirechnoy, Дык это первое,что объясняют в рунете любому человеку же!
  • @Radjah, Понимаешь, по тому же POSIX команды, даже если они встроены в командный интерпретатор(твой один большой бинарник) должны быть продублированы и в виде отдельных утилит. Поэтому всё в этом плане у бизибокса правильно сделано.
  • @Dorif, У него же тупо симлинки на бинарник основной. o_0
  • @Radjah, И так бы можно. Главное — чтоб были как бы отдельные утилитки. А как они сделаны- дело десятое. Хоть на яваскрипте пиши.
  • @Dorif, Отдельные файлы?
  • @Radjah, Угу.
  • @Dorif, Ну да. Потому и любопытствую.
  • @tzirechnoy, Ну, я думал это настолько очевидно, что и спрашивать не надо.)
  • @borman, Суровым стилем кода.
  • @Dorif, Прочитал пост, улыбнулся. Хотел заглянуть в исходники ради интереса. Пролистал комменты чуть дальше, увидел охуительные истории про редакторы в системном программировании. Перекрестился, в исходники заглядывать побоялся.
  • @Dorif, Да, из серьёзного. Ошыбки надо отрабатывать. Если пользуешься read()/write() — то особено EAGAIN.
  • @Yareg, Ок, исправил. Спасиб за наставление! Только сейчас дошло, что смена контекста, которая происходит при системном вызове занимает много процессорного времени.
  • @Dorif, Глянул код pwd, если PWD не задана getenv вернёт 0 и будет сигфолт в 28-ой строке.
  • @sany, Досмотри код до конца. NULL обрабатывается. Сначала пытается получить путь к текущей директории другим способом. Потом вызывает обработчик ошибок.
  • @Dorif, Вот фрагмент кода:

    p = getenv("PWD");
    if (p[0] != '/'||

    После getenv нет проверки на NULL, и если он вернёт NULL, то будет сигфолт при обращении к p[0].
  • @sany, А да, проглядел ка-то. Спасибо!
  • @sany, Да-да. if ( (p = getenv("PWD")) && ( (*p != '/') ...
  • @Dorif, И да, использование printf() добавляет не один килобайт при статической линковке с правильными libc. Полный разбор параметров довольно дорог. В общем, хорошо бы как-нибудь от него избавиться.
  • @tzirechnoy, Например? И не через системный вызов(сожрёт процессорное время на переключение контекста) и чтоб не раздувало получающийся бинарь.
  • @Dorif, Не понял — что например? Например как доавляет несколько kb? Возьми dietlibc, собери статически puts("hello.\n") и сравни с printf("hello\n");
    И я совсем ничего не понял про системный вызов.
  • @tzirechnoy, Кстати, фиг там — по умолчанию gcc преобразует printf("hello") в puts("hello"). То есть надо или лезть за ключом, который отключает интеллект или компилировать printf("hello%d.\n", 1);