2014-01-13 2 views
3

Недавно я учусь операционной system..I просто хочу знать:разница между записью() и Е()

В чем разница между системным вызовом (как пишут()) и стандартную библиотечную функцию (например, Printf (?))

ответ

23

Системный вызов является вызовом функции, которая не является частью приложения, но находится внутри ядра. Ядро - это программный уровень, который предоставляет вам некоторые базовые функции для абстрагирования аппаратного обеспечения. Грубо говоря, ядро ​​- это то, что превращает ваше оборудование в программное обеспечение.

Вы всегда используете write(), чтобы написать что-нибудь на периферии, какое бы устройство вы ни пишете. write() предназначен только для написать последовательность байтов, вот и все и ничего более. Но поскольку write() считается слишком простым (вы можете написать целое число из десяти оснований или число с плавающей точкой в ​​научной нотации и т. Д.), Различные библиотеки предоставляются вам различными типами программных сред, чтобы облегчить вам работу.

Например, язык программирования C дает вам printf(), что позволяет записывать данные в разных форматах. Итак, вы можете понять printf() как функцию, которая преобразует ваши данные в отформатированную последовательность байтов и вызывает write() для записи этих байтов на выходе. Но C++ дает вам cout; Java System.out.println и т. Д. Каждая из этих функций заканчивается вызовом write().

Одна вещь, которая должна знать (важно), заключается в том, что такой системный вызов является дорогостоящим! это не простой вызов функции, потому что вам нужно вызывать что-то, что находится за пределами вашего собственного кода, и система должна гарантировать, что вы не пытаетесь делать неприятные вещи и т. д. Таким образом, это очень распространено в более высокой функции, подобной печати, встроена буферизация; так что запись не всегда называется, но ваши данные хранятся в какой-то скрытой структуре и записываются только тогда, когда это действительно необходимо или необходимо (буфер заполнен или вы действительно хотите увидеть результат своей печати).

Это именно то, что происходит, когда вы управляете своими деньгами. Если многие люди дают вам по 5 долларов каждый, вы не будете вкладывать каждый в банк! Вы держите на своем кошельке (это печать) до такой степени, что она заполнена или вы больше не хотите их хранить. Затем вы отправляетесь в банк и делаете большой депозит (это пишите). И вы знаете, что положить 5 долларов на ваш кошелек гораздо быстрее, чем отправиться в банк и внести депозит. Банк - это ядро ​​/ ОС.

+0

«Банк - это ядро ​​/ ОС» :) lol! – lol

+1

Так что 'write()' вкладывает каждые 5 долларов в банк непосредственно, в то время как 'printf()' ждет, пока буфер не соберет много вещей. Вот почему 'printf()' может создавать странные выходы, когда родительский и дочерний процессы пытаются распечатать материал на периферии. Разве это не так? – Everyone

+0

Точно! Вы это хорошо понимаете. –

1

Системные вызовы выполняются операционной системой и выполняются в режиме ядра. Функции библиотеки реализованы в пользовательском режиме, как и код приложения. Функции библиотеки могут вызывать системные вызовы (например, printf в конечном итоге вызывает write), но это зависит от функции библиотеки (для математических функций обычно не требуется использовать ядро).

1

Системные вызовы в ОС используются при взаимодействии с ОС. Например. Write() можно использовать что-то в системе или в программе.

В то время как функции стандартной библиотеки специфичны для программы, например. printf() распечатает что-то, но он будет только в GUI/командной строке и не будет работать с системой.

Извините, не смог прокомментировать, потому что мне нужна репутация 50 для комментариев.

EDIT: Barmar имеет хороший ответ

0

Я пишу небольшую программу. На данный момент он просто читает каждую строку из stdin и печатает ее в stdout. Я могу добавить вызов для записи в цикле, и он добавит несколько символов в конце каждой строки. Но когда я использую printf вместо этого, тогда все дополнительные символы группируются и появляются сразу, а не появляются в каждой строке.

Кажется, что использование printf вызывает буферизацию stderr. Добавление fflush(stdout); после вызова printf устраняет несоответствие на выходе.

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