Một cái gì đó đặc biệt về / dev / fd / 3


9

Tôi đã cố gắng tìm hiểu về mô tả tập tin. Khi tôi gõ "ls -l / dev / fd /" tôi nhận được

lrwx------ 1 me users 64 May  2 16:02 0 -> /dev/pts/5
l-wx------ 1 me users 64 May  2 16:02 1 -> /home/me/file
lrwx------ 1 me users 64 May  2 16:02 2 -> /dev/pts/5
lr-x------ 1 me users 64 May  2 16:02 3 -> /proc/31518/fd

/ dev / fd / 3 dường như đang trỏ đến quy trình hiện tại. Tuy nhiên, giải thích về các mô tả tệp mà tôi đã thấy, ví dụ: http://www.tldp.org/LDP/abs/html/io-redirection.html , không nói có gì đặc biệt về / dev / fd / 3 (và ngụ ý nó giống như bất kỳ / dev / fd / N cho N> 3). Những gì đang xảy ra ở đây?

Tôi đã quan sát điều này trên arch linux và ubfox, nhưng không phải trên máy chủ solaris tôi có tài khoản ssh.

Câu trả lời:


12

/ dev / fd / 3 dường như đang trỏ đến quy trình hiện tại.

Tức là, lschính nó (lưu ý rằng pid sẽ không tồn tại sau đó). Tất cả những thứ thực sự liên quan đến quy trình hiện tại, vì các mô tả tệp không phải là toàn cầu; không chỉ có một 0, 1 và 2 cho toàn bộ hệ thống - có 0, 1 và 2 riêng biệt cho mỗi quy trình.

Như Frederik Dweerdt lưu ý, /dev/fdlà một liên kết tượng trưng. Nếu bạn lặp lại lstừ các thiết bị đầu cuối khác nhau, bạn sẽ nhận thấy các liên kết đến các ptys khác nhau. Chúng sẽ khớp với đầu ra của ttylệnh.

Trong lsví dụ này, tôi sẽ tưởng tượng mô tả 3 là cái được sử dụng để đọc hệ thống tập tin. Một số lệnh C (ví dụ open()), làm nền tảng cho việc tạo mô tả tệp, đảm bảo trả về "bộ mô tả tệp không sử dụng được đánh số thấp nhất" ( POSIX - lưu ý rằng mức mở thấp () thực sự không phải là một phần của Tiêu chuẩn C). Vì vậy, chúng được tái chế sau khi được đóng lại (nếu bạn mở và đóng các tệp khác nhau nhiều lần, bạn sẽ nhận được 3 dưới dạng fd nhiều lần).

Nếu bạn muốn có manh mối về cách chúng tồn tại, đây là đoạn mã C sử dụng opendir(), mà bạn có thể tìm thấy trong nguồn cho ls:

// open directory for reading
DIR *dh = opendir(".");
// print the fd of the directory handle to standard out:
printf("fd: %d\n", dirfd(dh));
closedir(dh);  

Chạy như vậy, fd sẽ là 3, vì đó là mô tả không sử dụng thấp nhất (0, 1 và 2 đã tồn tại).


12

/dev/fd/3không phải là một mô tả tiêu chuẩn (chỉnh sửa: gán). Nó (chỉnh sửa: có nhiều hơn 0, 1 và 2) dành riêng cho trường hợp của bạn ( ls). Bạn có thể chạy ls qua strace để hiểu điều gì xảy ra:

strace -e trace=openat,readlink ls -l /dev/fd/
openat(AT_FDCWD, "/dev/fd/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
readlink("/dev/fd/0", "/dev/pts/0", 65) = 10
readlink("/dev/fd/1", "/dev/pts/0", 65) = 10
readlink("/dev/fd/2", "/dev/pts/0", 65) = 10
readlink("/dev/fd/3", "/proc/28401/fd", 65) = 14

lslà để hiển thị nội dung /dev/fdgiống như vậy /proc/self/fd. lsphải mở thư mục để đọc các mục của nó. /dev/fd/3chỉ là mô tả tập tin cho thư mục này.

Các chương trình khác không có /dev/fd/3:

start cmd:> sleep 100 &
[1] 28414

ec:0   17:28:10  hl@inno:~/.wine/drive_c
start cmd:> ls -l /proc/28414/fd
insgesamt 0
crw------- 1 hl tty 136, 0 18. Apr 01:18 0
crw------- 1 hl tty 136, 0 18. Apr 01:18 1
crw------- 1 hl tty 136, 0 18. Apr 01:18 2

Có lẽ hơi sai lầm khi nói rằng nó "không phải là một mô tả chuẩn. Nó là cụ thể cho trường hợp của bạn ..."? 3 là một mô tả tệp bình thường chính xác như 0, 1 và 2, nhưng 0, 1 và 2 có các bài tập tiêu chuẩn (tiêu chuẩn trong, tiêu chuẩn ra, lỗi tiêu chuẩn) trong khi 3 có thể là bất cứ điều gì. Lưu ý rằng có thể sử dụng 0, 1 và 2 theo cùng một cách, nhưng điều này sẽ được coi là một thực tiễn xấu.
goldilocks

^ sẽ là ^ -> có thể, vì nó chắc chắn sẽ xảy ra nếu bạn, ví dụ , close(0).
goldilocks

Nếu bạn đã sử dụng fd 3, ls có chọn fd khác không?
CMCDragonkai

@CMCDragonkai Thy sallall open()sử dụng bộ mô tả tệp miễn phí đầu tiên. Ứng dụng gọi điện không nên quan tâm đến số của nó; đó là lý do tại sao nó được trả lại bởi cuộc gọi.
Hauke ​​Laging 20/2/2016

6

Trên Archlinux, /dev/fdlà một liên kết tượng trưng đến /proc/self/fd. Những gì bạn đang thấy là fdthư mục lslệnh của bạn . Và lệnh này thực sự đã mở thư mục dưới dạng mô tả tập tin 3.

EDIT: BTW, một cách tốt để hiểu những gì đang diễn ra là sử dụng strace. Bạn sẽ thấy quá trình mở mô tả tập tin.

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.