Obawiam się, że twoje zrozumienie jest całkowicie wstecz. :)
Pomyśl o „standardowym wejściu”, „standardowym wyjściu” i „standardowym błędzie” z perspektywy programu , a nie z perspektywy jądra.
Gdy program musi wydrukować dane wyjściowe, zwykle drukuje na „standardowe wyjście”. Program zwykle drukuje dane wyjściowe na standardowe wyjście, przy printf
czym drukuje TYLKO na standardowe wyjście.
Gdy program musi wydrukować informacje o błędzie (niekoniecznie wyjątki, są to konstrukcje języka programowania, narzucone na znacznie wyższym poziomie), zwykle drukuje na „błędzie standardowym”. Zwykle robi to za pomocą fprintf
, który akceptuje strumień plików do użycia podczas drukowania. Strumieniem plików może być dowolny plik otwarty do zapisu: standardowe wyjście, błąd standardowy lub dowolny inny plik otwarty za pomocą fopen
lub fdopen
.
„standardowe wejście” jest używane, gdy plik musi odczytać dane wejściowe, używając fread
lub fgets
, lub getchar
.
Każdy z tych plików można łatwo przekierować z powłoki, tak jak to:
cat /etc/passwd > /tmp/out # redirect cat's standard out to /tmp/foo
cat /nonexistant 2> /tmp/err # redirect cat's standard error to /tmp/error
cat < /etc/passwd # redirect cat's standard input to /etc/passwd
Lub cała enchilada:
cat < /etc/passwd > /tmp/out 2> /tmp/err
Istnieją dwa ważne zastrzeżenia: po pierwsze, „standardowe wejście”, „standardowe wyjście” i „standardowy błąd” to tylko konwencja. Są to bardzo mocna konwencja, ale wszystko jest tylko zgodą, że bardzo miło jest móc uruchamiać programy w ten sposób: grep echo /etc/services | awk '{print $2;}' | sort
i mieć standardowe wyjścia każdego programu podłączone do standardowego wejścia następnego programu w potoku.
Po drugie, podałem standardowe funkcje ISO C do pracy ze strumieniami plików ( FILE *
obiektami) - na poziomie jądra są to wszystkie deskryptory plików ( int
odniesienia do tabeli plików) oraz operacje na niższych poziomach, takie jak read
i write
, które nie wykonaj szczęśliwe buforowanie funkcji ISO C. Pomyślałem, że będę prostszy i używał łatwiejszych funkcji, ale pomyślałem, że mimo wszystko powinieneś znać alternatywy. :)