Вызовы
printf()
и malloc()
вызывают библиотеку времени выполнения C (libc). Библиотека времени выполнения C является слоем поверх ядра и может в конечном итоге вызвать ядро в зависимости от обстоятельств.
Ядро обеспечивает несколько примитивное распределение памяти через brk()
(расширение / сжатие сегмента данных) и mmap()
(отображение страниц памяти в виртуальное адресное пространство процесса). malloc()
Libc внутренне управляет памятью, полученной из ядра, и пытается минимизировать системные вызовы (среди прочего, она также пытается избежать чрезмерной фрагментации и пытается добиться хорошей производительности в многопоточных программах, поэтому приходится делать некоторые компромиссам).
stdio
ввод / вывод (через *printf()/*scanf()
) буферизуется и завершается вызовом системных вызовов ядра write()/read()
. По умолчанию stderr
(поток ошибок) небуферизован или буферизован строкой (ISO C §7.19.3 )7), так что ошибки можно увидеть сразу. stdin
и stdout
являются буферизованными или небуферизованными линиями, если не установлено, что они не подключены к интерактивному устройству, поэтому интерактивные запросы на ввод корректно работают. stdin
и stdout
могут быть полностью буферизованы (буферизованы блоком), если они ссылаются на файл на диске или другой неинтерактивный поток.
Это означает, что вывод ошибок по умолчанию гарантированно будет виден, как только вы выводите символ '\n'
(перевод строки) (если вы не используете setbuf()/setvbuf()
). Нормальный выход дополнительно требует подключения к терминалу или другому интерактивному устройству для обеспечения этой гарантии.