Standardowe strumienie

Z Linux Wiki
(Przekierowano z Standardowe wejście)
Skocz do: nawigacja, szukaj

Do standardowych strumieni należą 3 podstawowe strumienie wejścia/wyjścia – standardowe wejście, standardowe wyjście i standardowe wyjście błędów. Ten pierwszy dostarcza zazwyczaj dane wprowadzane z klawiatury, a dwa kolejne – dane wyświetlane na ekranie terminala tekstowego.

Standardowe wejście[edytuj]

Standardowe wejście to pierwszy z trzech podstawowych strumieni. Posiada deskryptor pliku o numerze 0 (zawarty też w stałej STDIN_FILENO z pliku nagłówkowego <unistd.h> w C). W pliku nagłówkowym <stdio.h> jest znany jako zmienna stdin (typu FILE*).

Standardowe wejście jest używane do pobierania danych (zazwyczaj tekstu) do programu. Źródłem tych danych jest zazwyczaj klawiatura, jednak może to ulec zmianie, np. przy użyciu potoku (z poziomu powłoki) standardowym wejściem jest standardowe wyjście procesu po drugiej stronie.

Standardowe wyjście[edytuj]

Standardowe wyjście jest drugim ze standardowych strumieni. Ma deskryptor pliku o numerze 1 (zawarty też w stałej STDOUT_FILENO z <unistd.h>), a w <stdio.h> występuje jako stdout.

Służy ono do wyświetlania przez aplikację danych (zazwyczaj tekstu). Zazwyczaj trafiają one na terminal tekstowy, chociaż może to zostać zmienione, np. przy pomocy (wspomnianego już) potoku mogą one trafiać na standardowe wyjście procesu po drugiej stronie.

Standardowe wyjście błędów[edytuj]

Standardowe wyjście błędów to trzeci i ostatni standardowy strumień. Jego deskryptor pliku to 2 (zawarty też w stałej STDERR_FILENO). W <stdio.h> jest przedstawiony jako zmienna stderr.

Jak można wywnioskować z nazwy, strumień ten służy do wyświetlania błędów. Zazwyczaj dane na niego wysłane trafiają, podobnie jak w przypadku zwykłego standardowego wyjścia, na ekran terminala tekstowego. Mimo to, jest on od stdout całkowicie niezależny (mimo iż na ekranie terminala są wyświetlane tak samo), co ułatwia diagnostykę. Przykładowo, w przypadku wspomnianego wcześniej potoku dane z stdout pierwszego procesu trafiają prosto na stdin drugiego procesu i są dla użytkownika niewidoczne. Jeśli jednak w pierwszym procesie wystąpi błąd, może on wysłać informację o nim na stderr, dzięki czemu trafi ona nie do drugiego procesu, ale do użytkownika.

Przykłady[edytuj]

Z użyciem <stdio.h>[edytuj]

Przykład ten na początku wyświetli na standardowe wyjście prośbę o podanie liczby 10 i wczyta linię ze standardowego wejścia. Jeśli liczba podana w linii to 10, wyświetli na standardowe wyjście informację o tym i zwróci 0 (powodzenie) jako kod wyjścia, jeśli nie – wyświetli odpowiednią informację na standardowe wyjście błędów i zwróci 1 jako kod wyjścia.

#include <stdio.h>
 
int main() {
  int liczba;
  printf("Podaj liczb_ 10.\n");
  scanf("%i", &liczba);
  if (liczba == 10) {
    fprintf(stdout, "Podana liczba to 10.\n");
    return 0;
  } else {
    fprintf(stderr, "Podana liczba to %i, nie 10.\n", liczba);
    return 1;
  }
}

Działanie (przy założeniu, że powyższy kod umieściliśmy w pliku strumienie.c:

$ cc strumienie.c -o strumienie
$ ./strumienie
Podaj liczb_ 10.
10
Podana liczba to 10.
$ ./strumienie
Podaj liczb_ 10.
16
Podana liczba to 16, nie 10.

Należy zauważyć, że printf("Ciąg znaków") oznacza to samo, co fprintf(stdout, "Ciąg znaków").