stdin(3)

NAZWA
stdin, stdout, stderr - standardowe strumienie wejścia/wyjścia

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

SKŁADNIA
#include <stdio.h>

extern FILE  *stdin;
extern FILE  *stdout;
extern FILE  *stderr;

OPIS
W zwykłych okolicznościach, każdy program uniksowy przy starcie ma otwierane trzy strumienie: jeden do wejścia, jeden do wyjścia i jeden do wypisywania diagnostyki lub błędów. Są one zwykle wiązane z terminalem użytkownika (zob. tty(4), lecz mogą też odnosić się do plików lub innych urządzeń, w zależności od ustawienia żądanego przez proces macierzysty (zob. też rozdział „Redirection” (przekierowanie) w podręczniku sh(1)).

Strumień wejściowy określa się jako „standardowe wejście” (ang. standard input), strumień wyjściowy jako „standardowe wyjście” (ang. standard output), a strumień błędów jako „standardowe wyjście błędów” (ang. standard error). Skrócona postać angielskich nazw tworzy symbole, za pomocą których można odnosić się do tych plików: stdin, stdout i stderr.

Każdy z tych symboli jest makrem stdio(3) typu wskaźnik, wskazującym na FILE i może być użyty z funkcjami takimi jak fprintf(3) lub fread(3).

Ponieważ FILE są opakowaniem buforującym uniksowe deskryptory plików, do tych samych plików można dostać się również za pomocą surowego uniksowego interfejsu pliku tj. funkcji takich jak read(2) i lseek(2).

Przy uruchomieniu programu, liczbami deskryptorów plików związanymi ze strumieniami stdin, stdout i stderr są, odpowiednio, 0, 1 i 2. W <unistd.h> są zdefiniowane symbole preprocesora STDIN_FILENO, STDOUT_FILENO i STDERR_FILENO z tymi wartościami (zastosowanie freopen(3) do jednego z tych strumieni może zmienić numer deskryptora pliku powiązanego ze strumieniem).

Proszę zauważyć, że mieszane stosowanie FILE i surowych deskryptorów plików może dawać nieoczekiwane wyniki i powinno się go unikać (dla masochistów: POSIX.1, rozdział 8.2.3, opisuje szczegółowo jak ta współpraca powinna wyglądać). Ogólna zasada jest taka, że deskryptory plików są obsługiwane w jądrze, natomiast stdio jest tylko biblioteką. Oznacza to na przykład, że po exec(3) potomkowie odziedziczą wszystkie otwarte deskryptory plików, natomiast wszystkie stare strumienie staną się niedostępne.

Ponieważ symbole stdin, stdout i stderr są określone jako makra, przypisania do nich są nieprzenośne. Standardowe strumienie mogą być również przypisane do różnych plików, za pomocą funkcji bibliotecznej freopen(3), wprowadzonej specjalnie, aby dało się zmienić przypisania stdin, stdout i stderr. Standardowe strumienie są zamykane wywołaniem do exit(3) oraz przez zwykłe zakończenie programu.

STANDARDY
C11, POSIX.1-2008.

Standardy wymagają także, aby te trzy strumienie były otwierane przy uruchomieniu programu.

HISTORIA
C89, POSIX.1-2001.

UWAGI
Strumień stderr jest niebuforowany. Strumień stdout jest buforowany do wiersza, gdy wskazuje na terminal. Wiersze częściowe nie pojawią się, dopóki nie wywoła się fflush(3) lub exit(3) albo dopóki nie wypisany będzie znak nowego wiersza. Może to dawać nieoczekiwane wyniki, szczególnie przy wyjściu debugowania. Tryb buforowania standardowych strumieni (lub dowolnych strumieni) można zmienić wywołaniem setbuf(3) lub setvbuf(3). Proszę zauważyć, że w przypadku gdy stdin jest powiązany z terminalem, rolę może odgrywać również buforowanie wejścia w sterowniku terminala, zupełnie nie związane z buforowaniem stdio (i faktycznie, zwykłe wejście na terminalu jest buforowane do wiersza w jądrze). Tę obsługę wejścia w jądrze można zmienić wywołaniami takimi jak tcsetattr(3); zob. też stty(1) i termios(3).

ZOBACZ TAKŻE
csh(1), sh(1), open(2), fopen(3), stdio(3)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.