Tại sao tôi không thể đọc / dev / stdout với trình soạn thảo văn bản?


9

Tôi mới bắt đầu tìm hiểu Làm thế nào mọi thứ là một tệp TM trên Linux, điều này khiến tôi tự hỏi điều gì sẽ xảy ra nếu tôi thực sự đọc từ / dev / stdout:

$ cat /dev/stdout 
^C
$ tail /dev/stdout 
^C

(Tôi ^Cđang giết chương trình sau khi nó bị treo).

Khi tôi thử vim, tôi nhận được thông báo không thể tưởng tượng: "/ dev / stdout" không phải là một tệp. Thở hổn hển!

Vì vậy, những gì mang lại, tại sao tôi nhận được hangouts hoặc thông báo lỗi khi tôi cố đọc các "tệp" này?


1
Những gì vim coi là một tệp và ý nghĩa của "mọi thứ là một tệp" (không có nhãn hiệu liên quan) trong * nix không giống nhau. Xem ví dụ # 1# 2 .
goldilocks

Câu trả lời:


11

tại sao tôi nhận được hangouts

Bạn không nhận được "hangouts" từ cat(1)tail(1), họ chỉ chặn đọc. cat(1)chờ đợi đầu vào và in nó ngay khi thấy một dòng hoàn chỉnh:

$ cat /dev/stdout
foo
foo
bar
bar

Ở đây tôi đã gõ fooEnterbarEnterCTRL- D.

tail(1)chờ đầu vào và chỉ in khi có thể phát hiện EOF:

$ tail /dev/stdout
foo
bar
foo
bar

Ở đây tôi gõ lại fooEnterbarEnterCTRL- D.

hoặc thông báo lỗi

Vim là người duy nhất cung cấp cho bạn một lỗi. Nó làm điều đó bởi vì nó chạy stat(2) ngược lại /dev/stdoutvà nó thấy nó không được S_IFREGthiết lập bit.

/dev/stdoutlà một tập tin, nhưng không phải là một tập tin thông thường . Trong thực tế, có một số bước nhảy trong kernel để cung cấp cho nó một mục trong hệ thống tập tin. Trên Linux:

$ ls -l /dev/stdout
lrwxrwxrwx 1 root root 15 May  8 19:42 /dev/stdout -> /proc/self/fd/1

Trên OpenBSD:

$ ls -l /dev/stdout
crw-rw-rw-  1 root  wheel   22,   1 May  7 09:05:03 2015 /dev/stdout

Trên FreeBSD:

$ ls -l /dev/stdout
lrwxr-xr-x  1 root  wheel  4 May  8 21:35 /dev/stdout -> fd/1

$ ls -l /dev/fd/1
crw-rw-rw-  1 root  wheel  0x18 May  8 21:35 /dev/fd/1

5

(Hầu hết) mọi thứ đều là một tệp nhưng không phải mọi thứ đều là một tệp thông thường . Sẽ không có ý nghĩa khi gọi một trình soạn thảo văn bản trên một cái gì đó là một tệp đặc biệt như thư mục, ổ cắm mạng, cổng nối tiếp, v.v.

Tệp /dev/stdoutcó thể là một trong nhiều thứ tùy thuộc vào biến thể unix:

  • một tập tin đặc biệt của người Viking, thường là một thiết bị ký tự;
  • một liên kết biểu tượng ma thuật của người Viking chỉ vào tệp mà quá trình truy cập nó đã mở trên mô tả này;
  • một liên kết tượng trưng cho một trong những điều trên.

Trong mọi trường hợp, việc mở /dev/stdoutvà các tệp tương tự sẽ tạo ra một bộ mô tả tệp mới được liên kết với cùng một tệp mà ứng dụng đã mở trên bộ mô tả tệp 1. Tiêu chuẩn đầu ra cho đầu ra - kernel không quan tâm.

Khi bạn chạy một chương trình trong một thiết bị đầu cuối, tất cả ba mô tả tiêu chuẩn (0 = đầu vào tiêu chuẩn, 1 = đầu ra tiêu chuẩn, 2 = lỗi tiêu chuẩn) được mở trên thiết bị đầu cuối. Đọc từ thiết bị đó trả về các ký tự được người dùng nhập và viết vào thiết bị đó sẽ hiển thị văn bản trong cửa sổ đầu cuối. (Không có cách tiêu chuẩn nào, được cung cấp một thiết bị đầu cuối, để đọc đầu ra mà nó hiển thị hoặc đưa đầu vào vào nó.)

Khi bạn chạy cat /dev/stdout, điều đó thực hiện chính xác giống như cat /dev/stdinhoặc cat /dev/stderr, bởi vì ba mô tả tệp này được kết nối với cùng một tệp: nó yêu catcầu đọc từ thiết bị đầu cuối. Đó là những gì catkhông có tranh luận quá.

Nếu bạn đã chạy cat /dev/stdout >foo, sau đó /dev/stdoutsẽ tham khảo tệp foo- lệnh đó tương đương với cat foo >foo. Tùy thuộc vào việc cattriển khai, nó có thể bị lỗi (phiên bản GNU phàn nàn rằng tệp đầu vào của chế độ là tệp đầu ra,) hoặc nó có thể không làm gì cả vì nó đọc từ tệp footrống ( >foochỉ cắt bớt tệp). Với một phiên bản catkhông phát hiện trường hợp đặc biệt này, nếu fookhông trống, cat /dev/stdout >>foohoặc tương đương cat foo >>foosẽ nối thêm nội dung của tệp vào chính nó vô thời hạn.

Khi bạn chạy vim /dev/stdout, nó phàn nàn vì nó không biết cách chỉnh sửa thiết bị đầu cuối (điều đó không có ý nghĩa gì).


2

cattailđang tìm kiếm nội dung tùy chọn theo sau là phần cuối của tệp. /dev/stdoutvẫn mở, vì vậy cattailchỉ cần tiếp tục tìm kiếm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.