Стандартни стриймове

от Уикипедия, свободната енциклопедия
Направо към: навигация, търсене

В компютърното програмиране, стандартните стриймове са предварително свързани входящи и изходящи комуникационни канали между компютърна програма и нейната платформа. Трите входящи/изходящи връзки се наричат стандартен входящ поток (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.

Стандартнa грешка (standard error)[редактиране | редактиране на кода]

Стандартна грешка е друг изходящ поток от данни, използван обикновено от програмите да извежда съобщение за грешки или симптоми за такива. Това е поток, който е отделно от стандартния поток от данни и може да бъде пренасочван отделно. Този процес е аналогичен на функционалното връщане на двойка от стойности и решава полупредикатния проблем, позволявайки разграничаване на изходящите данни и грешките. Обичайната дестинация е текстовия терминал, който стартира програмата за да се осигури най-добрата възможност да бъде видян, дори и, ако стандартния поток от данни е пренасочен. Например- изходящия поток от данни от една програма е пренасочват във входящия на следващата програма, но грешките от всяка от двете програми отиват директно в текстовия терминал.

Приемливо и нормално е стандартният изходящ поток от данни и стандартните грешки да бъдат насочвани към една и съща дестинация, каквато е текстовия терминал. Съобщенията се появяват в същия ред, в който програмата ги записва, освен ако има процес на буфериране.(Например, често срещана ситуация е, когато стандартният поток от грешки не е буфериран, но стандартният изходящ поток се буферира линейно. В този случай текст, въведен по-късно към потока от грешки, може да се появи по-рано в терминала. Това се случва, ако буферирането на стандартния изходящ поток от данни все още не е завършило.)

Файловата характеристика за стандартна грешка е дефинирана като 2 (две) от POSIX. Главният <unistd.h> файл предоставя символа STDERR_FILENO. Съответната променлива <stdio.h> e FILE* stderr. C++ потокът <iostream> осигурява свързването да две променливи с потока: std::cerr и std::clog. Последният не е бил буфериран, но по-късно използва същия механизъм за буфериране като всички други C++ потоци. Стилът на пределно обвиване позволява стандартна грешка да бъде пренасочвана към същата дестинация, към която е насочен да използва и стандартният изходящ поток от данни:

2>&1

Csh-стилът позволява стандартна грешка да бъде пренасочвана към същата дестинация, към която е и насочен да използва стандартният изходящ поток от данни:

>&

Стандартната грешка е добавена в Unix след поредица от набори от въвеждане на изображения, завършвайки с изписване вместо директното изобразяване на устройството на клиента.

Времева Линия[редактиране | редактиране на кода]

1950s: Fortran[редактиране | редактиране на кода]

Фортран има еквивалента на 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

1960: ALGOL 60[редактиране | редактиране на кода]

ALGOL 60 е критикуван, че няма стандартен достъп до файлове.

1968: ALGOL 68[редактиране | редактиране на кода]

Входно-изходните команди в 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!

1970s: C and Unix[редактиране | редактиране на кода]

Впрограмният език С, стандартните стриймове входящи данни, изходящи данни и грешка са прикрепени към стандартните Unix файлови описания 0, 1 и 2 респективно.

1995: Java[редактиране | редактиране на кода]

В 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());
            }
        }
    }

2000s: .NET[редактиране | редактиране на кода]

В С# и други .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“ в Уикипедия на английски. Оригиналният текст, както и този превод, са защитени от Лиценза „Криейтив Комънс - Признание - Споделяне на споделеното“, а за съдържание, създадено преди юни 2009 година — от Лиценза за свободна документация на ГНУ. Прегледайте историята на редакциите на оригиналната страница, както и на преводната страница. Вижте източниците на оригиналната статия, състоянието ѝ при превода, и списъка на съавторите.