Стандартни стриймове
В компютърното програмиране, стандартните стриймове са предварително свързани входящи и изходящи комуникационни канали между компютърна програма и нейната платформа. Трите входящи/изходящи връзки се наричат стандартен входящ поток (stdin
), стандартен изходящ поток (stdout
) и стандартна грешка (stderr
). В началото изходно/входящите връзки се случваха чрез физически свързана конзолна система (входящо спрямо клавиатура, изходящо чрез монитор), но стандартните стриймове премахнаха тази необходимост. Когато се зададе команда чрез входящо устройство, стриймовете типично са свързани към текстовия терминал на входящото устройство, но това може да бъде сменено чрез редистрибуция, т.е. един стрийм може да вземе за входящи, изходящите данни от друг такъв. Казано с други думи, дъщерният процес ще наследи стандартният стрийм на своят процес родител.
Приложение
[редактиране | редактиране на кода]Потребителите познават стандартните стриймове като медиуми, чрез които текст от входящо устройство се изпраща към изходящо такова, като например монитор. Понеже те се използват от входящи и изходящи устройства стриймовете по принцип съдържат текст, последователност от символи в предварително установен кодирован стандарт, като Latin-10 или UTF-8.
Стандартните стриймове могат също така да се навържат, като по този начин изходящите данни от дадена програма, могат да станат входящите на друга такава. Добре познат пример е използването на комнадата more
, която дава на потребителя начин да контролира, коя част от изходящия стрийм се показва на дисплея.
Въпреки че стандартната употреба, за стриймовете е да съдържат текст, те често са използвани и за трансфер на бинарна информация.
Предистория
[редактиране | редактиране на кода]В повечето операционни системи, предхождащи Unix, програмите трябваше изрично да се свържат със съответните входни и изходни устройства. OS-специфични тънкости, са причина това да бъде досадна за програмиране задача. На много системи беше необходимо да се сдобият с контрол над настройките на околната среда, достъп до една маса локални файлове, при което се снабдиха с предназначен набор от данни, за да се справят с хардуера правилно в случаи, при които се чете перфокарта, магнитно лентов диск, линеен принтер, перфокарта, или интерактивен терминал.
Едно от няколкото революционни постижения на Unix, било абстрактни устройства, които премахват необходимостта от програма да знае или да се грижи с какъв вид устройства комуникира. По-старите операционни системи принуждават програмистта да прави рекордна структура и често не-ортогонални семантични данни и устройство за управление. Unix елиминира тази сложност с концепцията на потока от данни: подредена последователност от битове данни, които могат да се четат до края на файла. Една програма може също да напише байтовете по желание и не се нуждае от обявяване колко ще бъдат там, или как ще бъдат групирани.
Друг Unix пробив е автоматично вход и изход свързване по подразбиране – програмата (и програмистът) не прави абсолютно нищо, за да въведе на входа и изхода типична входно-изходна програма (освен ако не е избрал различна парадигма). Предишните операционни системи, които обикновено са изисквали честа сложност в контрола на работата на езика, за да се установят връзки, или еквивалентна тежест, е трябвало да бъдат дирижирани от програмата.
Откакто Unix предоставят стандартни потоци, Unix C Runtime Environment (среди за разработка) са длъжни да ги подкрепят. В резултат на това повечето „C“-среди за разработка (и потомци на C), независимо от операционната система, осигуряват равностойна функционалност.
Стандартен вход (стандартния вход)
[редактиране | редактиране на кода]Стандартен вход е поток от данни (често текст), влизащи в дадена програма. Програмата изисква трансфер на данни чрез използване на операция за четене. Не всички програми изискват въвеждане на поток. Например, „dir“ и „ls“ – програми (които показват имената на файловете, съдържащи се в директория) могат да вземат аргументи от командния ред, но изпълняват своите операции без никакъв вход на потока от данни.
Освен ако пренасочения, стандартен вход се очаква от клавиатурата, която стартира програмата.
Файловото описание за стандартния вход е 0 (нула); POSIX дефиницията <unistd.h> е STDIN_FILENO; съответното <stdio.h> променливата е FILE * stdin; По същия начин, <iostream> променливата е STD: CIN.
Стандартен изход (стандартния изход)
[редактиране | редактиране на кода]Стандартен изход е поток, където програма пише нейните изходни данни. Програмата изисква трансфер на данни чрез операции по запис. Не всички програми генерират продукция. Например на файл преименуваната команда (различно нарича MV, ход, или Ren) мълчи по успех.
Освен ако не е пренасочен, стандартния изход е текстов терминал, който инициира програмата.
Файловата характеристика на стандартните входни данни е 1 (един); на POSIX дефиницията <unistd.h> е STDOUT_FILENO; съответното <stdio.h> променливата е FILE * стандартния изход; По същия начин, <iostream> променливата е STD: Cout.
Стандартна грешка (standard error)
[редактиране | редактиране на кода]Стандартна грешка е друг изходящ поток от данни, използван обикновено от програмите да извежда съобщение за грешки или симптоми за такива. Това е поток, който е отделно от стандартния поток от данни и може да бъде пренасочван отделно. Този процес е аналогичен на функционалното връщане на двойка от стойности и решава полупредикатния проблем, позволявайки разграничаване на изходящите данни и грешките. Обичайната дестинация е текстовия терминал, който стартира програмата за да се осигури най-добрата възможност да бъде видян, дори и ако стандартния поток от данни е пренасочен. Например – изходящия поток от данни от една програма е пренасочват във входящия на следващата програма, но грешките от всяка от двете програми отиват директно в текстовия терминал.
Приемливо и нормално е стандартният изходящ поток от данни и стандартните грешки да бъдат насочвани към една и съща дестинация, каквато е текстовия терминал. Съобщенията се появяват в същия ред, в който програмата ги записва, освен ако има процес на буфериране.(Например, често срещана ситуация е, когато стандартният поток от грешки не е буфериран, но стандартният изходящ поток се буферира линейно. В този случай текст, въведен по-късно към потока от грешки, може да се появи по-рано в терминала. Това се случва, ако буферирането на стандартния изходящ поток от данни все още не е завършило.)
Файловата характеристика за стандартна грешка е дефинирана като 2 (две) от POSIX. Главният <unistd.h> файл предоставя символа STDERR_FILENO. Съответната променлива <stdio.h> e FILE* stderr. C++ потокът <iostream> осигурява свързването да две променливи с потока: std::cerr и std::clog. Последният не е бил буфериран, но по-късно използва същия механизъм за буфериране като всички други C++ потоци.
Стилът на пределно обвиване позволява стандартна грешка да бъде пренасочвана към същата дестинация, към която е насочен да използва и стандартният изходящ поток от данни:
2>&1
Csh-стилът позволява стандартна грешка да бъде пренасочвана към същата дестинация, към която е и насочен да използва стандартният изходящ поток от данни:
>&
Стандартната грешка е добавена в Unix след поредица от набори от въвеждане на изображения, завършвайки с изписване вместо директното изобразяване на устройството на клиента.
Времева Линия
[редактиране | редактиране на кода]Фортран има еквивалента на Unix File Descriptors: UNIT=5
за stdin,UNIT=6
за stdout и UNIT=0
за stderr.
! FORTRAN 77 example PROGRAM MAIN READ(UNIT=5,*)NUMBER WRITE(UNIT=6,'(F5.3)')' NUMBER IS: ',NUMBER END
ALGOL 60 е критикуван, че няма стандартен достъп до файлове.
Входно-изходните команди в ALGOL 68, са под общото име транзитни команди. Корнелиус Костър съгласува дефиницията на транзитните команди. Моделът включва три стандартни канала stand in
, stand out
и stand back
.
Пример:
# ALGOL 68 example # main:( REAL number; getf(stand in,($g$,number)); printf(($"Number is: „g(6,4)“OR „$,number)); # OR # putf(stand out,($“ Number is: „g(6,4)“!"$,number)); newline(stand out)
)
Входящи данни:
3.14159
Изходящи данни:
Number is: +3.142 OR Number is: +3.142!
Впрограмният език С, стандартните стриймове входящи данни, изходящи данни и грешка са прикрепени към стандартните Unix файлови описания 0, 1 и 2 респективно.
В Java стандартните стриймове се извикват чрез: System.in
(за stdin), System.out
(за stdout)и System.err
(за stderr).
public static void main(String args[]) { try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String s = br.readLine(); double number = Double.parseDouble(s); System.out.println(„Number is:“ + number); } catch (Exception e) { System.err.println(„Error:“ + e.getMessage()); } }
Или може да бъде използван Scanner
, клас на java.util.
public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNextLine()) { String line = sc.nextLine(); try { double number = Double.parseDouble(line); System.out.println("Number is: " + number); } catch (Exception e) { System.err.println(„Error:“ + e.getMessage()); } } }
В С# и други .NET езици, стандартните стриймове се извикват чрез: System.Console.In
(stdin), System.Console.Out
(stdout) и System.Console.Error
(stderr). Обикновените въможности като чета и пиша на стандартните стриймове stdin и stdout могат да бъдат извикани и директно чрез класът System.Console
, т.е. System.Console.WriteLine()
може да бъде използвано вместо System.Console.Out.WriteLine()
System.Console.In
, System.Console.Out
и System.Console.Error
са обектите System.IO.TextReader
(stdin) и System.IO.TextWriter
(stdout, stderr), които дават достъп само текстовите данни на въпросните стандартни стриймове. Пълен бинарен достъп до стандартните стриймове може да се постигне чрез обекта System.IO.Stream
и коандите System.Console.OpenStandardInput()
, System.Console.OpenStandardOutput()
и System.Console.OpenStandardError()
респективно.
// C# example public static int Main(string[] args) { try { string s = System.Console.In.ReadLine(); double number = double.Parse(s); System.Console.Out.WriteLine(„Number is: {0:F3}“, number); return 0;
// If Parse() threw an exception } catch (System.ArgumentNullException) { System.Console.Error.WriteLine(„No number was entered!“); } catch (System.FormatException) { System.Console.Error.WriteLine(„The specified value is not a valid number!“); } catch (System.OverflowException) { System.Console.Error.WriteLine(„The specified number is too big!“); }
return -1; }
' Visual Basic .NET example
Public Function Main() As Integer Try Dim s As String = System.Console.[In].ReadLine() Dim number As Double = Double.Parse(s) System.Console.Out.WriteLine(„Number is: {0:F3}“, number) Return 0
If Parse() threw an exception Catch ex As System.ArgumentNullException System.Console.[Error].WriteLine(„No number was entered!“) Catch ex2 As System.FormatException System.Console.[Error].WriteLine(„The specified value is not a valid number!“) Catch ex3 As System.OverflowException System.Console.[Error].WriteLine(„The specified number is too big!“) End Try Return -1 End Function
Когато се използва класът System.Diagnostics.Process
, потребителят може да използва мигновените методи StandardInput
, StandardOutput
и StandardError
от този клас за достъп до стандартните стриймове на въпросния процес.
Графични потребителски интерфейси
[редактиране | редактиране на кода]Графичните потребителски интерфейси (Graphical User Interfaces) рядко използват стандартните потоци. Следователно пренасочването на такива програми или изграждането на такава съвкупност от потоци не е нито практично, нито полезно. Вероятно най-близкото сходство е копирането или изрязването от едно приложение и поставянето в друго. Откакто се изискват ръчни потребителски операции, използването на много на брой поставяния не е особено ефикасно. Менюто с услуги работещо на NeXTSTEP и Mac OS X също е аналог на стандартните потоци. В тези операционни системи графичните приложения могат да предоставят функционалност чрез системно меню с широк набор от опции, което работи върху текущата селекция в GUI без значение на какво приложение.
Някои GUI програми, преди всичко работещи на Unix, все още вписват информацията от дебъгването на приложението като стандартна грешка. Други (като много Unix медия плеъри) могат да четат файлове от стандартния вход. Известни Windows програми, които отварят отделен конзолен прозорец в допълнение към техните GUI прозорци са pSX и DOSBox.
GTK-сървър може да използва стандартния вход като комуникационен интерфейс с разяснителна програма, който да реализира графичен потребителски интерфейс.
Образецът „Common Lisp Interface Manager“ представя изпратените елементи на графичния потребителски интерфейс до разширения изходен поток.
Източници
[редактиране | редактиране на кода]- "Standard Streams", The GNU C Library
- KRONOS 2.1 Reference Manual, Control Data Corporation, Part Number 60407000, 1974
- NOS Version 1 Applications Programmer's Instant, Control Data Corporation, Part Number 60436000, 1978
- Level 68 Introduction to Programming on MULTICS Архив на оригинала от 2021-02-25 в Wayback Machine., Honeywell Corporation, 1981
- Evolution of the MVS Operating System, IBM Corporation, 1981
- Lions' Commentary on UNIX Sixth Edition, John Lions, ISBN 1-57398-013-7, 1977
- Console Class, .NET Framework Class Library, Microsoft Corporation, 2008
Тази страница частично или изцяло представлява превод на страницата Standard_streams в Уикипедия на английски. Оригиналният текст, както и този превод, са защитени от Лиценза „Криейтив Комънс – Признание – Споделяне на споделеното“, а за съдържание, създадено преди юни 2009 година – от Лиценза за свободна документация на ГНУ. Прегледайте историята на редакциите на оригиналната страница, както и на преводната страница, за да видите списъка на съавторите.
ВАЖНО: Този шаблон се отнася единствено до авторските права върху съдържанието на статията. Добавянето му не отменя изискването да се посочват конкретни източници на твърденията, които да бъдат благонадеждни. |