Поскольку вы специально запросили printf()
, я собираюсь предположить, что вы имеете в виду наиболее общий способ, когда он заполнит буфер разумного размера и вызовет системный вызов write(2)
до stdout
и что stdout
указывает на ваш терминал.
В большинстве операционных систем, когда вы вызываете определенные системные вызовы, вызывающий поток / процесс удаляется из запускаемого ЦПсписок и помещен в отдельный список ожидания.Это верно для всех вызовов ввода / вывода, таких как чтение / запись / и т. Д.Временное удаление из обработки из-за ввода-вывода - это не то же самое, что перевод в спящий режим через таймер.
Например, в Linux существует непрерывное состояние сна потока / процесса, специально предназначенного для ожидания ввода-вывода., в то время как прерывистое состояние сна для тех потоков / процессов, которые ожидают на таймеры и события.Хотя, с точки зрения тупого пользователя, они оба кажутся одинаковыми, их реализация за кулисами существенно отличается.
Чтобы ответить на ваш вопрос, вызов printf()
не совсемспит, но ждет, пока буфер будет сброшен на устройство, а не на самом деле во сне.Даже тогда есть еще несколько причуд, о которых вы можете прочитать в signal(7)
и даже больше о различных состояниях процессов / потоков из Marek's blog.
Hopeэто помогает.