Có nghĩa là gì khi kết nối stdout là gì khi kết nối stdout và stdin?

      100

Tôi khá bồn chồn với mục đích của tía tập tin này. Nếu sự phát âm biết của tôi là đúng mực, thì stdin là tệp cơ mà chương trình ghi vào các hưởng thụ của chính nó để chạy một tác vụ vào tiến trình, stdout là tệp mà lại hạt nhân ghi Áp sạc ra của chính nó và quy trình trải nghiệm nó truy cập thông tin trường đoản cú kia, cùng stderr là các tập tin mà lại toàn bộ những ngoại lệ được nhập vào. khi mnghỉ ngơi những tệp này để kiểm soát xem những điều này có thực thụ xảy ra hay là không, tôi thấy có vẻ không có gì gợi nhắc nlỗi vậy!

Những gì tôi hy vọng biết là đúng đắn mục đích của những tệp này là gì, trọn vẹn không có câu vấn đáp với khôn cùng không nhiều thuật ngữ công nghệ!


linuxstdoutstdinstderr
178
2 thg 8, 2010Shouvik
Đầu vào tiêu chuẩn - đấy là tệp xử lý tệp nhưng các bước của người tiêu dùng đọc để lấy lên tiếng trường đoản cú bạn.

Bạn đang xem: Có nghĩa là gì khi kết nối stdout là gì khi kết nối stdout và stdin?

Đầu ra tiêu chuẩn - tiến trình của người tiêu dùng ghi công bố bình thường vào tệp giải pháp xử lý này.

Lỗi tiêu chuẩn - tiến trình của người tiêu dùng ghi công bố lỗi vào tệp xử lý này.

Đó là về sự dại nnơi bắt đầu nhỏng tôi có thể tạo cho nó :-)

Tất nhiên, kia chủ yếu là theo quy ước. Không gồm gì ngnạp năng lượng bạn viết báo cáo lỗi của bạn vào áp ra output tiêu chuẩn chỉnh nếu như bạn muốn. Quý Khách thậm chí là có thể đóng góp trọn vẹn bố tay gắng tệp cùng mlàm việc tệp của riêng rẽ bạn mang lại I/O.

lúc tiến trình của bạn bước đầu, nó sẽ sở hữu các tay vắt này msinh hoạt với nó chỉ rất có thể phát âm từ và/hoặc viết cho chúng.

Theo khoác định, bọn chúng có thể được liên kết cùng với máy đầu cuối của người sử dụng (ví dụ: /dev/tty) nhưng lại shell đã cho phép chúng ta tùy chỉnh cấu hình kết nối giữa những tay núm này với các tệp và/hoặc vật dụng cụ thể (hoặc thậm chí là là con đường ống mang lại các tiến trình khác) trước khi quá trình của người tiêu dùng bước đầu (một số trong những của những thao tác làm việc rất có thể là hơi thông minh).

Một ví dụ là:

my_prog errorfile | grep XYZloại nào sẽ:

tạo nên một các bước cho my_prog.mở inputfile làm đầu vào tiêu chuẩn chỉnh của khách hàng (cách xử trí tệp 0).mở errortệp tin là lỗi tiêu chuẩn chỉnh của người sử dụng (cách xử lý tệp 2).chế tạo tiến trình khác đến grep.kèm theo cổng đầu ra tiêu chuẩn chỉnh của my_prog với đầu vào tiêu chuẩn chỉnh của grep.

Nhận xét của bạn:

khi tôi mnghỉ ngơi các tệp này trong thư mục/dev, tại vì sao tôi không lúc nào thấy cổng output của một tiến trình sẽ chạy?

Đó là chính vì chúng không hẳn là các tập tin thông thường. Trong Lúc UNIX trình diễn đa số trang bị dưới dạng tệp trong một hệ thống tệp ở đâu kia, điều này không làm cho nó ở tại mức thấp tốt nhất. Hầu không còn những tệp vào khối hệ thống phân cấp /dev là ký trường đoản cú hoặc khối hận lắp thêm, đích thực là trình điều khiển sản phẩm. Chúng không tồn tại kích cỡ nhưng bọn chúng có số thứ thiết yếu và phụ.

Lúc chúng ta msinh sống chúng, các bạn vẫn kết nối với trình tinh chỉnh và điều khiển đồ vật chđọng không phải tệp đồ gia dụng lý cùng trình điều khiển và tinh chỉnh trang bị đầy đủ tối ưu để biết rằng các quy trình đơn nhất bắt buộc được xử trí riêng.

Điều này cũng như với hệ thống tập tin Linux /proc. Đó chưa phải là các tập tin thực, chỉ cần những cổng điều hành và kiểm soát chặt chẽ thông báo kernel.


Sẽ đúng hơn Lúc nói rằng stdin, stdout với stderr là "luồng I/O" chứ chưa hẳn là tệp. Như bạn đã nhận được thấy, những thực thể này sẽ không sinh sống trong khối hệ thống tập tin. Nhưng triết lý Unix, theo nhỏng I/O tất cả tương quan, là "số đông vật dụng rất nhiều là một trong những tập tin". Trong thực tiễn, điều ấy đích thực tức là bạn cũng có thể áp dụng cùng các tính năng với hình ảnh tlỗi viện (printf, scanf, read, write, select, v.v.) nhưng ko cần lo ngại về việc liệu luồng I/O đạt được liên kết với 1 tệp, keyboard ổ gặm, mặt đường ống hoặc một số trừu tượng I/O khác.

Xem thêm: Thermoplastic Là Gì - Tìm Hiểu Nhựa Tpe Là Gì

Hầu không còn những lịch trình đề nghị hiểu đầu vào, ghi đầu ra cùng ghi nhật ký lỗi, bởi vậy stdin, stdout cùng stderr được xác định trước cho bạn, nlỗi một sự tiện lợi mang đến lập trình sẵn. Đây chỉ là 1 trong quy ước với ko được hệ điều hành và quản lý thực hiện.


Để bổ sung cập nhật cho những câu trả lời ngơi nghỉ trên, đấy là tổng đúng theo về Chuyển hướng:
*

EDIT: Đồ họa này không hoàn toàn chính xác dẫu vậy tôi không Chắn chắn tại sao ...

Đồ họa cho thấy thêm 2> & 1 có chức năng giống như như &> mặc dù nhiên

ls Documents ABC > dirdanh mục 2>&1#does not give the same output as ls Documents ABC > dirlist &>
Tôi sợ sự hiểu biết của bạn là hoàn toàn không tân tiến. :)

Hãy nghĩ về "tiêu chuẩn trong", "tiêu chuẩn chỉnh ra" với "lỗi tiêu chuẩn" trường đoản cú phối cảnh chương thơm trình, không phải từ quan điểm của hạt nhân.

Khi một công tác đề xuất in Áp sạc ra, nó hay in thành "tiêu chuẩn ra". Một công tác hay in cổng đầu ra thành tiêu chuẩn chỉnh với printf, in CHỈ ra tiêu chuẩn chỉnh.

Lúc một lịch trình đề xuất in lên tiếng lỗi (không tuyệt nhất thiết là ngoại lệ, chính là kết cấu ngôn ngữ lập trình sẵn, được áp đặt ở tại mức cao hơn nữa nhiều), nó thường in thành "lỗi tiêu chuẩn". Nó thường xuyên làm điều đó cùng với fprintf, đồng ý luồng tệp để thực hiện khi in. Luồng tệp hoàn toàn có thể là bất kỳ tệp như thế nào được mnghỉ ngơi nhằm ghi: lỗi tiêu chuẩn, lỗi tiêu chuẩn hoặc ngẫu nhiên tệp nào không giống đã có được msống bằng fopen hoặc fdopen.

"Standard in" được sử dụng lúc tệp nên hiểu đầu vào, áp dụng fread hoặc fgets hoặc getchar.

Bất kỳ tệp làm sao trong những này cũng rất có thể dễ dàng gửi hướng từ Shell, như vậy này:

cát /etc/passwd > /tmp/out # redirect cat"s standard out to /tmp/foocát /nonexistant 2> /tmp/err # redirect cat"s standard error khổng lồ /tmp/errormèo Hoặc, toàn cục enchilada:

mèo /tmp/out 2> /tmp/errCó nhì lưu ý quan lại trọng: Thứ đọng độc nhất, "tiêu chuẩn chỉnh trong", "tiêu chuẩn chỉnh ra" cùng "lỗi tiêu chuẩn" chỉ là 1 trong quy ước. Chúng là một trong những quy ước siêu mạnh, tuy thế tất cả chỉ là 1 trong những thỏa thuận hợp tác rằng thật tốt Lúc có thể chạy những công tác như thế này: grep eđến /etc/services | awk "print $2;" | sort cùng tất cả đầu ra output tiêu chuẩn của từng lịch trình được nối vào nguồn vào tiêu chuẩn chỉnh của chương trình tiếp theo trong con đường ống.

Thứ nhị, tôi đã cung ứng các hàm ISO C tiêu chuẩn chỉnh để triển khai bài toán cùng với những luồng tệp (các đối tượng người sử dụng FILE *) - nghỉ ngơi cấp độ nhân, toàn bộ phần đa là các thể hiện tệp (tsay đắm chiếu int vào bảng tệp) với các chuyển động nghỉ ngơi cấp độ rẻ rộng những như read cùng write , ko thực hiện cỗ đệm niềm hạnh phúc của những tính năng ISO C. Tôi cho rằng để giữ mang đến nó đơn giản và dễ dàng và thực hiện các tính năng dễ dãi hơn, cơ mà tôi nghĩ tất cả giống hệt như bạn cần hiểu rõ những lựa chọn sửa chữa. :)


stdin

Đọc nguồn vào thông qua bảng điều khiển và tinh chỉnh (ví dụ: Nhập bàn phím). Được sử dụng trong C cùng với scanf

scanf(, ...);

xuất sắc

Tạo đầu ra output mang đến bối cảnh tinh chỉnh. Được thực hiện trong C với printf

printf(, ...);

stderr

Tạo cổng output "lỗi" mang lại bàn tinh chỉnh và điều khiển. Được áp dụng trong C cùng với fprintf

fprintf(stderr, , ...);

Chuyển hướng

Nguồn mang lại stdin hoàn toàn có thể được chuyển hướng. Ví dụ: thế vày mang đến từ đầu vào bàn phím, nó hoàn toàn có thể đến từ một tệp (emang đến ) hoặc lịch trình không giống (ps | grep ).

Các điểm đến chọn lựa cho máy xuất chuẩn, thiết bị xuất chuẩn chỉnh cũng rất có thể được chuyển hướng. lấy một ví dụ, đồ vật xuất chuẩn chỉnh hoàn toàn có thể được đưa hướng đến một tệp: ls . > ls-output.txt, trong trường thích hợp này, đầu ra output được ghi vào tệp ls-output.txt. Stderr hoàn toàn có thể được chuyển qua làn đường khác cùng với 2>.


Tôi nghĩ rằng đa số người nói stderr chỉ nên được áp dụng cho các thông tin lỗi là rơi lệch.

Nó cũng buộc phải được áp dụng cho các thông báo hiện đang có ý nghĩa sâu sắc đối với người dùng đang chạy lệnh với ko dành riêng cho ngẫu nhiên quý khách dữ liệu tiềm năng làm sao (ví dụ: nếu bạn chạy một ống Shell gồm một số trong những lệnh chúng ta không thích gồm thông báo nhỏng "thừa nhận mục 30 42424 "xuất hiện thêm bên trên stdout vày họ sẽ gây nên lầm lẫn cho người tiêu dùng, mà lại bạn vẫn có thể mong mỏi người dùng nhận thấy họ.

Xem này để tìm hiểu nguyên do định kỳ sử:

"Tất cả các công tác đặt chẩn đoán thù trên cổng đầu ra tiêu chuẩn chỉnh. Điều này luôn gây ra sự cầm cố Lúc đầu ra được chuyển làn thành một, tuy nhiên trở phải bắt buộc chịu đựng được lúc cổng đầu ra được gửi mang lại một tiến trình không ngờ vực. Tuy nhiên, không muốn phạm luật tính dễ dàng và đơn giản của nguồn vào tiêu chuẩn- Mô hình Áp sạc ra tiêu chuẩn, những người gật đầu triệu chứng này qua v6. Ngay tiếp đến Dennis Ritchie vẫn giảm nút Gordian bằng cách đưa ra lỗi tiêu chuẩn. Điều đó là không đủ. Với chẩn đoán mặt đường ống hoàn toàn có thể tới từ ngẫu nhiên chương trình như thế nào chạy cùng lúc. nhằm dìm diện bao gồm họ. "