số liên kết / Proc / PID / fd / X


36

Trong Linux, trong /proc/PID/fd/X, các liên kết cho các mô tả tệp là các đường ống hoặc ổ cắm có một số, như:

l-wx------ 1 user user 64 Mar 24 00:05 1 -> pipe:[6839]
l-wx------ 1 user user 64 Mar 24 00:05 2 -> pipe:[6839]
lrwx------ 1 user user 64 Mar 24 00:05 3 -> socket:[3142925]
lrwx------ 1 user user 64 Mar 24 00:05 4 -> socket:[3142926]
lr-x------ 1 user user 64 Mar 24 00:05 5 -> pipe:[3142927]
l-wx------ 1 user user 64 Mar 24 00:05 6 -> pipe:[3142927]
lrwx------ 1 user user 64 Mar 24 00:05 7 -> socket:[3142930]
lrwx------ 1 user user 64 Mar 24 00:05 8 -> socket:[3142932]
lr-x------ 1 user user 64 Mar 24 00:05 9 -> pipe:[9837788]

Giống như trên dòng đầu tiên: 6839. Con số đó đại diện cho cái gì?

Câu trả lời:


36

Đó là số inode cho đường ống hoặc ổ cắm được đề cập.

Một ống là một kênh đơn hướng, với một đầu ghi và một đầu đọc. Trong ví dụ của bạn, có vẻ như FD 5 và FD 6 đang nói chuyện với nhau, vì các số inode là như nhau. (Có lẽ là không, mặc dù vậy. Xem bên dưới.)

Phổ biến hơn so với việc thấy một chương trình nói chuyện với chính nó qua một đường ống là một cặp chương trình riêng biệt nói chuyện với nhau, thường là do bạn thiết lập một đường ống giữa chúng bằng một vỏ:

shell-1$ ls -lR / | less

Sau đó, trong một cửa sổ thiết bị đầu cuối khác:

shell-2$ ...find the ls and less PIDs with ps; say 4242 and 4243 for this example...
shell-2$ ls -l /proc/4242/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 1 -> pipe:[222536390]
shell-2$ ls -l /proc/4243/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 0 -> pipe:[222536390]

Điều này nói rằng đầu ra tiêu chuẩn của PID 4242 (FD 1, theo quy ước) được kết nối với một đường ống có số inode 222536390 và đầu vào tiêu chuẩn của PID 4243 (FD 0) được kết nối với cùng một đường ống.

Tất cả đều là một cách dài để nói rằng lsđầu ra của nó đang được gửi đến lessđầu vào của.

Quay trở lại ví dụ của bạn, FD 1 và FD 2 gần như chắc chắn không nói chuyện với nhau. Nhiều khả năng đây là kết quả của việc buộc stdout (FD 1) và stderr (FD 2) với nhau, vì vậy cả hai đều đi đến cùng một đích. Bạn có thể làm điều đó với vỏ Bourne như thế này:

$ some-program 2>&1 | some-other-program

Vì vậy, nếu bạn chọc vào /proc/$PID_OF_SOME_OTHER_PROGRAM/fd, bạn sẽ thấy một FD thứ ba được gắn vào một đường ống có cùng số inode như được gắn vào FD 1 và 2 some-programchẳng hạn. Đây cũng có thể là những gì xảy ra với FD 5 và 6 trong ví dụ của bạn, nhưng tôi không có lý thuyết sẵn sàng về việc hai FD này gắn kết với nhau như thế nào. Bạn sẽ phải biết những gì chương trình đang làm trong nội bộ để tìm ra điều đó.


1
Ví dụ, tôi nghĩ, là pidgin- nó có rất nhiều ống & ổ cắm và những thứ khác, vì vậy đây là một ví dụ hay. Một câu hỏi cuối cùng: inodes chỉ cụ thể trong ngữ cảnh của một hệ thống tập tin cụ thể, đúng không? Như trong, tôi có thể có inode 3 trên /hệ thống tập tin của tôi và một nút khác (khác) inode 3 trên /boothệ thống tập tin của tôi .
Thanatos

4
Vâng. Trong trường hợp của /prochệ thống tập tin, các số inode chỉ được tạo ra một cách nhanh chóng (xem get_next_ino()trong fs/inode.ckernel), bắt đầu từ 0 khi hệ thống được khởi động mới. Cơ chế tạo ra chúng được chia sẻ bởi một số hệ thống tập tin không nhất quán của Linux (Proc, configfs, ramfs, autofs ...) trong đó các số inode duy nhất mặc dù ngữ nghĩa POSIX không yêu cầu nó. Đó là một trường hợp khá đặc biệt, tuy nhiên. Quy tắc bạn đang nói đến thường được tham chiếu liên quan đến các hệ thống tệp liên tục thông thường như ext3.
Warren Young

33

Đối với ổ cắm, bạn có thể tìm thêm thông tin về inode /proc/net/tcp, /proc/net/udphoặc /proc/net/unix. Ví dụ:

ls -l /proc/<pid>/fd
lrwx------ 1 root root 64 May 26 22:03 3 -> socket:[53710569]

Chúng tôi thấy inode là 53710569.

head -n1 < tcp ; grep -a 53710569 tcp
sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                   
155: 0100007F:001B 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0        0 53710569 1 ffff88011f52c200 300 0 0 2 -1

Trong trường hợp này, đây là ổ cắm nghe (không có địa chỉ từ xa), nghe trên cổng cục bộ 27 (0x1B). Địa chỉ IP là 4 byte trong hex trong "ký hiệu mạng", bạn có thể sử dụng inet_ntoachức năng để chuyển đổi nó thành ký hiệu abcd tiêu chuẩn (127.0.0.1 trong trường hợp này).

Lưu ý rằng các tệp này có vẻ là 0 byte nhưng có nội dung nếu bạn đọc chúng. Cũng lưu ý rằng -ađược yêu cầu với grep vì chúng có thể (ví dụ với unix) dường như là nhị phân.


Cũng có /proc/net/tcp6/proc/net/udp6cho IPv6.
Craig McQueen
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.