2014-11-22 2 views
1

На самом деле, кроме основного языка C, существует библиотека C. И если мое понимание правильное, функции, подобные printf, являются частью библиотеки C. Теперь я запрограммирован на C в Turbo C в Windows, а также с использованием gcc в Linux.Разница между printf в Windows и Linux

Мой вопрос: Являются ли реализация кода таких функций, как printf, одинаковыми как в Windows, так и в Linux? В конечном счете функция printf должна вызывать функцию в основной ОС (в обоих случаях), которая отображает символы ASCII на экране? Итак, поскольку обе ОС разные, будет ли выполняться код для printf в обоих случаях?

+1

Turbo C старше, чем первый стандарт C, поэтому не ожидайте, что он будет вести себя как другие стандартные соответствующие имплантации. –

ответ

5

Конечно реализация (из printf и все функции <stdio.h>) отличается (на Linux и Windows), но поведение должно быть в соответствии со спецификацией в стандарте C11 или C99.

Обратите внимание, что printf не отображает символы на экране, а отправляет их на стандартный вывод (см. printf(3)). Что-то еще - например. ядро tty и ваш terminal emulator на Linux- отображает символы на вашем экране (или в другом месте!).

В системах Linux и POSIX <stdio.h> в конечном счете использует system calls для записи данных в file descriptor. Это будет write(2) (для printf), а список системных вызовов доступен в syscalls(2). Имейте в виду, что stdout обычно буферизуется (особенно по соображениям производительности, что делает системный вызов write для каждого написанного байта слишком дорогостоящим). См. fflush(3) & setvbuf(3). Попробуйте использовать strace(1) в вашей Linux-программе, чтобы понять фактически используемые системные вызовы.

В Windows есть некоторые эквивалентные вещи (за исключением того, что список системных вызовов на Windows менее документирован и очень разных).

BTW, GNU/Linux в основном free software. Так что читайте Advanced Linux Programming затем изучить исходный код: чем libc зачастую glibc (но может быть musl-libc, и т.д ... так что вы можете иметь несколько реализаций printf на Linux, но, как правило, у вас есть один libc.so, даже если бы вы могли есть несколько), исходный код ядра доступен по адресу kernel.org.

+0

благодарит много друзей. – Akhil

+1

И некоторые части стандартной библиотеки C, такие как 'snprintf()', реализованы с большей точностью для стандарта C (C99) в Linux, чем в Windows. –

+0

В случае текстовых файлов одно отличие состоит в том, что в windows '\ n' транслируется в '\ r' + '\ n', тогда как в Linux no '\ r' добавляется к выходу. Linux должен добавить «\ r» при отображении текста на мониторе или при выводе на текстовое устройство, например, в матричный принтер старого стиля. – rcgldr

Смежные вопросы