2011-06-22 30 views
6

Từ http://www.cplusplus.com/reference/iostream/cout/:Là stdout Ever Anything Khác với một cửa sổ Console?

Theo mặc định, hầu hết các hệ thống có đầu ra tiêu chuẩn của họ đặt cho giao diện điều khiển, nơi tin nhắn văn bản được hiển thị, mặc dù điều này thường có thể được chuyển hướng.

Tôi chưa bao giờ nghe nói về một hệ thống nơi stdout là bất kỳ thứ gì khác ngoài cửa sổ bảng điều khiển, theo mặc định hoặc cách khác. Tôi có thể thấy cách chuyển hướng nó có thể có lợi trong các hệ thống mà in ấn là một hoạt động đắt tiền, nhưng đó không phải là một vấn đề trong các máy tính hiện đại, phải không?

+1

Trên dòng lệnh, tôi có thể gõ một cái gì đó như 'program.exe> ​​output.txt' và mọi thứ trên' stdout' sẽ được ghi vào 'output.txt' thay vì bàn điều khiển. Các script CGI cũng hoạt động theo cách này; chương trình viết ra HTML trên 'stdout' và máy chủ web cung cấp đầu ra xuống kết nối HTTP. –

+1

Ngoài ra, 'inetd' sẽ kết nối' stdin' và 'stdout' vào ổ cắm. –

Trả lời

8

Trên hầu hết các hệ thống, bạn có thể chuyển hướng đầu vào/đầu ra/lỗi chuẩn tới các bộ mô tả hoặc vị trí tệp khác.

Ví dụ (trên Unix):

./appname > output 

Chuyển hướng stdout từ appname vào một tập tin tên là đầu ra.

./appname 2> errors > output 

Chuyển hướng stdout đến một file có tên đầu ra, và tất cả các lỗi từ stderr vào một tập tin tên là lỗi.

Trên các hệ thống unix bạn cũng có thể có một chương trình mở một bộ mô tả tập tin và trỏ nó tại stdin, như thế này:

echo "input" > input 
cat input | ./appname 

này sẽ làm cho chương trình để đọc từ ống cho stdin.


Đây là cách bạn kết hợp các tiện ích khác nhau với nhau để tạo một công cụ lớn hơn.

find . -type f | ./appname | grep -iv "search" 

này sẽ chạy lệnh find, và đưa đầu ra và ống nó nó vào ./appname, sau đó appname 's đầu ra sẽ được gửi đến grep' s đầu vào mà sau đó tìm kiếm từ 'tìm kiếm', hiển thị chỉ là kết quả phù hợp.

Nó cho phép nhiều tiện ích nhỏ có hiệu ứng rất mạnh.


suy nghĩ của >, <, và | như hệ thống ống nước.

> giống như cống trong bồn rửa, nó chấp nhận dữ liệu và lưu trữ dữ liệu nơi bạn muốn đặt. Khi một vỏ gặp > nó sẽ mở một tập tin.

> file 

Khi vỏ nhìn thấy ở trên, nó sẽ open tệp bằng cách sử dụng cuộc gọi hệ thống chuẩn và ghi nhớ bộ mô tả tệp đó. Trong trường hợp trên vì không có đầu vào, nó sẽ tạo một tệp rỗng và cho phép bạn nhập nhiều lệnh hơn.

banner Hello 

Lệnh này viết chữ thật to lên bảng điều khiển và sẽ khiến thư di chuyển (tôi đang sử dụng Unix ở đây vì đó là những gì tôi biết rõ nhất). Đầu ra được viết đơn giản theo tiêu chuẩn. Sử dụng một "chìm" (>) chúng ta có thể kiểm soát nơi đầu ra đi, vì vậy

banner Hello > bannerout 

sẽ khiến tất cả các dữ liệu từ đầu ra tiêu chuẩn biểu ngữ để được chuyển hướng đến các mô tả tập tin vỏ đã mở ra và do đó được ghi vào một tệp có tên là bannerout.

Đường ống hoạt động tương tự như > trong đó chúng giúp kiểm soát lưu lượng của dữ liệu. Tuy nhiên, các đường ống không thể ghi vào tệp và chỉ có thể được sử dụng để giúp luồng dữ liệu chuyển từ điểm này sang điểm khác.

Ví dụ, đây là nước chảy qua nhiều trạm biến áp và làm sạch chất thải:

pump --from lake | treatment --cleanse-water | pump | reservoir | pump > glass 

Nước chảy từ hồ, thông qua một đường ống cho nhà máy xử lý nước, từ nhà máy trở lại vào một máy bơm mà di chuyển nó vào một hồ chứa, sau đó nó được bơm một lần nữa vào các đường ống nước thành phố và thông qua bồn rửa của bạn vào thủy tinh của bạn.

Lưu ý rằng các ống chỉ đơn giản là kết nối tất cả các đầu ra với nhau, cuối cùng nó kết thúc trong kính của bạn.

Cũng tương tự như vậy với các lệnh và xử lý chúng trong một trình bao trên Linux. Nó cũng đi theo một con đường để có được kết quả cuối cùng.

Bây giờ có một điều cuối cùng mà tôi chưa thảo luận trong các tuyên bố trước đó của tôi, đó là ký tự đầu vào <. Những gì nó làm là đọc từ một tập tin và đầu ra nó để stdin trên các chương trình.

cat < bannerout 

Sẽ chỉ in những gì được lưu trữ trong biểu ngữ. Điều này có thể được sử dụng nếu bạn có một tệp bạn muốn xử lý nhưng không muốn thêm trước cat <file> vì không muốn chạy thêm lệnh trong chuỗi.

Vì vậy, cố gắng này:

echo "Hello" > bannerinput 
banner < bannerinput 

này đầu tiên sẽ đặt chuỗi "Hello" trong tập tin bannerinput, và sau đó khi biểu ngữ chạy của bạn nó sẽ đọc từ tập tin bannerinput.

Tôi hy vọng điều này sẽ giúp bạn hiểu cách chuyển hướng và pipping hoạt động trên Unix (một số nếu không nhất cũng sẽ áp dụng cho Windows).

+0

Tôi không chắc tôi hiểu sự khác nhau giữa phương thức với '>' và phương thức với '|' là gì. – Maxpm

+1

Các> là một biểu tượng chuyển hướng, nó giống như một cống trong bồn rửa chén, phải mất tất cả mọi thứ và đặt nó trong tập tin được đề cập. Trong khi đó | là một đường ống. Nó cho phép dữ liệu chảy từ đầu ra của một tiến trình đến đầu vào của một tiến trình khác. –

14

Tất nhiên có thể. Tôi có thể muốn chuyển hướng tiêu chuẩn ra một tập tin văn bản, một quá trình, một ổ cắm, bất cứ điều gì. Theo mặc định, nó là Console, nhưng có nhiều lý do để chuyển hướng nó, hữu ích nhất (trong bước với triết lý Unix) là chuyển hướng đầu ra của một chương trình đến đầu vào của chương trình khác. Điều này cho phép người ta tạo ra nhiều chương trình nhỏ, nhẹ để nạp vào nhau và làm việc như các phần rời rạc của một hệ thống lớn hơn.

Về cơ bản, đó chỉ là một cơ chế đơn giản nhưng mạnh mẽ để chia sẻ dữ liệu. Nó phổ biến hơn trên các hệ thống * nix vì lý do tôi đề cập ở trên, nhưng nó cũng áp dụng cho Windows.

2

Cả Windows và Linux sẽ chuyển hướng stdout vào một tập tin nếu bạn chạy chương trình như thế này:

my_program > some_file

Đây là trường hợp phổ biến nhất, nhưng nhiều loại khác của chuyển hướng có thể xảy ra. Trên Linux, bạn có thể chuyển hướng stdout đến bất kỳ thứ gì hỗ trợ giao diện "mô tả tệp", chẳng hạn như đường ống, ổ cắm, tệp và nhiều thứ khác.

3

Bất kỳ số thứ nào cũng có thể xảy ra với ba mô tả tập tin chuẩn 0, 1 và 2. Bất kỳ ai cũng có thể khởi chạy quy trình mới với các bộ mô tả tệp đính kèm với bất kỳ thứ gì họ thích.

Ví dụ, màn hình GNU đặt đầu ra vào một đường ống và cho phép kết nối lại động một phiên. SSH lấy đầu ra và trả về đầu kia. Và tất nhiên tất cả các trình chuyển đổi nhiều trình bao thường xuyên sử dụng thao tác mô tả tệp.

1

Một ví dụ đơn giản về trường hợp mà người dùng có thể muốn chuyển hướng stdout là khi chuyển thông tin sang chương trình khác. Lệnh Unix/Linux ps tạo danh sách các quá trình thuộc về người dùng hiện tại. Nếu danh sách này đã lâu và bạn muốn tìm kiếm một quy trình cụ thể, bạn có thể nhập

ps | grep thing 

mà sẽ chuyển hướng stdout của ps đến stdin của grep thing.

4

Cho đến nay tất cả các câu trả lời đều nằm trong ngữ cảnh của điều (shell, bất cứ điều gì) gọi chương trình. Bản thân chương trình có thể làm cho stdout một cái gì đó khác với thiết bị đầu cuối. Thư viện chuẩn C cung cấp freopen cho phép lập trình viên chuyển hướng stdout trong bất kỳ môi trường phù hợp nào. POSIX cung cấp một số cơ chế khác (popen, fdopen, ...) cho phép lập trình viên kiểm soát nhiều hơn. Tôi nghi ngờ Windows cung cấp các cơ chế tương tự.

3

Đối với chương trình có stdout, chương trình phải chạy trên thực hiện được lưu trữ (một với Hệ điều hành), hoặc trên thực hiện tự do với các tính năng bổ sung.

Tôi đang gặp khó khăn trong việc xác định một triển khai như vậy mà không cần bàn điều khiển, nhưng giả sử một thời điểm mà Mars Rover có một hệ điều hành đầy đủ và được lập trình bằng C (hoặc C++) và không có giao diện điều khiển

/* 2001-07-15: JPL: stdout is the headquarters */ 
puts("Help. I'm stuck."); 

có thể đã gửi thư đến trụ sở của NASA.

Các vấn đề liên quan