Tính di động của các liên kết mô tả tập tin


20

Tôi luôn tự hỏi này nhưng không bao giờ mất thời gian để tìm hiểu, vì vậy tôi sẽ làm như vậy bây giờ - bao di động được sử dụng đưa ra ở đây của một trong hai /proc/$$/fd/$Nhoặc /dev/fd/$N? Tôi hiểu các đảm bảo POSIX /dev/null, /dev/tty, and /dev/console (mặc dù tôi chỉ phát hiện ra điều đó vào ngày khác sau khi đọc các bình luận về câu trả lời này ) nhưng còn những người khác thì sao?

Theo như tôi có thể nói chúng khá phổ biến, nhưng trong những hệ thống nào tôi không thể mong đợi để tìm thấy chúng? Tại sao không? Có nhiều khả năng tìm thấy cái này hơn cái kia không? Họ sẽ luôn luôn thể hiện như các thuộc tính?

Tôi có xu hướng sử dụng các thiết bị này khá nhiều theo mọi cách, và tôi muốn biết liệu có cơ hội nào tôi sẽ đến ngay khi thử không.

Ngoài ra, những câu hỏi trên chỉ nên được hiểu là những gì tôi nghĩ tôi muốn biết, nhưng, vì rõ ràng tôi phải hỏi ngay từ đầu, tôi có thể không biết rõ nhất về vấn đề này và chúng không nên được coi là yêu cầu nghiêm ngặt đối với một câu trả lời. Chỉ cần cho tôi biết nếu bạn có thể, xin vui lòng.

Câu trả lời:


27

Các liên kết tượng trưng là phổ biến trên Linux, nhưng chúng không tồn tại ở bất kỳ nơi nào khác (ngoại trừ Cygwin mô phỏng chúng). cũng tồn tại trên AIX và Solaris, nhưng chúng không phải là liên kết tượng trưng. Có thể, để có được thông tin về các tập tin đang mở, hãy cài đặt ./proc/PID/fd/NUM/proc/PID/fd/NUMlsof

Liên kết với /proc/PID/fd

Linux

Trong Linux, là một liên kết tượng trưng hơi kỳ diệu đến tệp mà quy trình với ID PID đã mở trên bộ mô tả tệp NUM . Liên kết này là ma thuật trong đó, ví dụ, nó có thể được sử dụng để truy cập tệp ngay cả khi tệp bị xóa. Liên kết sẽ theo dõi các tập tin thông qua đổi tên, quá. là một liên kết tượng trưng ma thuật chỉ ra nơi mà PID là quá trình truy cập vào liên kết./proc/PID/fd/NUM/proc/self/proc/PID

Tính năng này có mặt trên hầu hết tất cả các hệ thống Linux. Nó được trình điều khiển cung cấp cho hệ thống tập tin Proc , là tùy chọn về mặt kỹ thuật nhưng được sử dụng cho rất nhiều thứ (bao gồm cả việc thực hiện ps- nó đọc từ đó) mà gần như không bao giờ bị bỏ rơi ngay cả trên các hệ thống nhúng./proc/PID

Cygwin

Cygwin mô phỏng Linux (cho các quy trình Cygwin) và ./proc/PID/fd/NUM/proc/self

Solaris (kể từ phiên bản 2.6), AIX

Có các mục cho mỗi mô tả tệp, nhưng chúng xuất hiện cùng loại với tệp đã mở, vì vậy chúng không cung cấp thông tin về đường dẫn của tệp. Tuy nhiên, họ báo cáo cùng một thông tin như sẽ báo cáo cho quá trình mở tệp, vì vậy có thể xác định hệ thống tệp nào được đặt và số inode của nó. Các thư mục xuất hiện dưới dạng các liên kết tượng trưng, ​​tuy nhiên chúng là các liên kết ma thuật chỉ có thể được theo dõi và trả về một chuỗi trống./proc/PID/fdstatfstatreadlink

Trong AIX, procfileslệnh hiển thị một số thông tin về các tệp đang mở của một quy trình. Trong Solaris, pfileslệnh hiển thị một số thông tin về các tệp đang mở của một quy trình. Điều này không bao gồm đường dẫn đến tệp (trên Solaris, kể từ Solaris 10, xem bên dưới).

Solaris (kể từ phiên bản 10 )

Ngoài ra , các phiên bản Solaris hiện đại có chứa các liên kết tượng trưng tương tự như các liên kết tượng trưng của Linux . Các thông tin chỉ huy chương trình về một quá trình là tập tin mở, bao gồm cả đường dẫn./proc/PID/fd/NUM/proc/PID/path/NUM/proc/PID/fd/NUMpfiles

Kế hoạch9

/proc/PID/fdlà một tệp văn bản chứa một bản ghi (dòng) cho mỗi bộ mô tả tệp được mở theo quy trình. Tên tập tin không được theo dõi ở đó.

QNX

/proc/PID/ là một thư mục, nhưng nó không chứa bất kỳ thông tin nào về mô tả tập tin.

Thông báo với /procnhưng không có quyền truy cập trực tiếp vào mô tả tệp

(Lưu ý: đôi khi có thể lấy thông tin về các tệp đang mở của một quy trình bằng cách xem qua hình ảnh bộ nhớ của nó có thể truy cập được /proc. Tôi không tính đó là truy cập trực tiếp của Drake .)

Thông báo nơi là một tập tin/proc/PID

Hệ thống tập tin Proc tự khởi động trong phiên bản UNIX 8, nhưng với cấu trúc khác, và đã trải qua Kế hoạch 9 và quay lại một số thông báo. Tôi nghĩ rằng tất cả các hệ điều hành /proccó một mục nhập cho mỗi PID, nhưng trên nhiều hệ thống, đó là một tệp thông thường, không phải là một thư mục. Các hệ thống sau đây cần được đọc với :/proc/PIDioctl

  • Solaris lên tới 2,5
  • OSF / 1 hiện được gọi là Tru64
  • IRIX (?)
  • SCO (?)

PHÚT 3

MINIX 3 có một máy chủ Procfs cung cấp một số thành phần giống như Linux bao gồm các thư mục. Tuy nhiên điều này không có ./proc/PID//proc/PID/fd

FreeBSD

FreeBSD có các thư mục, nhưng họ không cung cấp thông tin về các mô tả tệp mở. (Tuy nhiên , tương tự như của Linux , cho phép truy cập vào tệp thực thi thông qua một liên kết tượng trưng.)/proc/PID//proc/PID/file/proc/PID/exe

Procfs của FreeBSD không được chấp nhận .

Đoàn kết mà không /proc

  • HP-UX
  • OpenBSD
  • NetBSD
  • Mac OS X

Thông tin mô tả tập tin thông qua các kênh khác

Bộ nhiệt áp

Các fuserdanh sách lệnh các quá trình có một tập tin mở nhất định, hoặc một tập tin mở trên quy định điểm lắp. Lệnh này là tiêu chuẩn (có sẵn trên tất cả các hệ thống XSI -compliant, tức là POSIX với Tiện ích mở rộng giao diện hệ thống X / Open).

Bạn không thể đi từ một quá trình để đặt tên với tiện ích này.

Lsof

Lsof là viết tắt của danh sách các tập tin mở. Nó là một công cụ của bên thứ ba , có sẵn (nhưng thường không phải là một phần của cài đặt mặc định) cho hầu hết các biến thể unix. Có được thông tin về các tệp đang mở rất phụ thuộc vào hệ thống, vì phân tích ở trên có thể khiến bạn nghi ngờ. Trình bảo trì lsof đã thực hiện công việc kết hợp tất cả trong một giao diện duy nhất.

Bạn có thể đọc FAQ để xem những loại khó khăn mà lsof phải đối mặt. Trên hầu hết các thông báo, việc lấy thông tin về tên của các tệp đang mở đòi hỏi phải phân tích cấu trúc dữ liệu kernel. Trích dẫn từ FAQ 3,3 Tại sao không báo cáo tên đường dẫn đầy đủ?

Lsof không thể có được các thành phần tên đường dẫn từ bộ đệm tên hạt nhân của các phương ngữ sau:

  • AIX

Chỉ nhân Linux ghi lại tên đường dẫn đầy đủ trong các cấu trúc mà nó duy trì về các tệp đang mở; thay vào đó, hầu hết các hạt nhân chuyển đổi tên đường dẫn thành các chuỗi nhân đôi số thiết bị và nút và sử dụng chúng cho các tham chiếu tệp tiếp theo sau khi các tệp đã được mở.

Nếu bạn cần phân tích thông tin từ lsofđầu ra, hãy chắc chắn sử dụng -Fchế độ (một trường trên mỗi dòng), tốt nhất là -F0chế độ (các trường được phân tách bằng null). Để có được thông tin về một bộ mô tả tệp cụ thể của một quy trình cụ thể, hãy sử dụng -atùy chọn với và , vd .-p PID-d NUMlsof -a -p 123 -d 0 -F0n

/dev/fd/NUM cho các mô tả tập tin của quá trình hiện tại

Nhiều biến thể unix cung cấp một cách để một quá trình truy cập các tệp đang mở của nó thông qua tên tệp: mở tương đương với gọi điện . Các tên này hữu ích khi một chương trình muốn một tên tệp nhưng bạn muốn truyền một tệp đã mở (ví dụ: ống hoặc ổ cắm); ví dụ các shell thực hiện thay thế quá trình sử dụng chúng nếu có (sử dụng một đường ống có tên tạm thời nếu không có sẵn)./dev/fd/NUMdup(NUM)/dev/fd

Ở đâu /dev/fdtồn tại, cũng thường có (luôn luôn?) Từ đồng nghĩa (đôi khi là liên kết tượng trưng, ​​đôi khi là liên kết cứng, đôi khi là các tệp ma thuật có thuộc tính tương đương) /dev/stdin= /dev/fd/0, /dev/stdout= /dev/fd/1, /dev/stderr= /dev/fd/2.

  • Trong Linux, /dev/fdlà một liên kết tượng trưng đến /proc/self/fd.
  • Trong hầu hết các thông báo ( IRIX , OpenBSD , NetBSD , SCO, Solaris , Hoài ), các mục trong /dev/fdlà các thiết bị ký tự. Chúng thường xuất hiện cho dù bộ mô tả tệp có mở hay không và các mục nhập có thể không có sẵn cho các bộ mô tả tệp trên một số nhất định.
  • Trong FreeBSD và OSX, hệ thống tập tin fdescfs cung cấp một /dev/fdthư mục động theo các mô tả mở của quy trình gọi. Một tĩnh /dev/fdcó sẵn /dev/fdlà không được gắn kết.
  • Theo OSF / 1 (Tru64), /dev/fdđược cung cấp qua fdfs .
  • Không có /dev/fdtrên AIX hoặc HP-UX.

Những phát biểu của bạn về Solaris có chút lỗi thời. Với các bản phát hành Solaris dưới 10 năm, pfileslệnh hiển thị đường dẫn mô tả tệp. Nó lấy thông tin này từ /proc/<pid>/paththư mục mà bạn cũng có thể đề cập. Xem docs.oracle.com/cd/E19253-01/817-0547/esxiq/index.html
jlliagre

9

Cách thức /procđược thực hiện và các tính năng mà nó cung cấp không được tiêu chuẩn hóa theo bất kỳ cách nào, xem ví dụ ở đây . Theo Wikipedia, FreeBSD đang "giảm dần" /proc, xem tại đây để biết chi tiết .

Kể từ đó /dev, /dev/fd/không phải là một phần của POSIX hoặc Đặc tả người dùng đơn (SUSv3) trong khi System V và BSD hỗ trợ nó.

Phụ lục:

Linux: /dev/fd/*là các liên kết tượng trưng đến /proc/self/fd.

FreeBSD: /dev/fd/*được cung cấp thông qua fdescfs.

NetBSD: giống như FreeBSD.

OpenBSD: giống như FreeBSD.

Solaris: có /dev/fd/*.

IRIX: có /dev/fd/*.

Tru64 Unix: /dev/fd/*theo nixdoc.net , tài liệu Tru64 chính hãng tại HP không thể hiểu được (cậu bé, thật là một mớ hỗn độn! Bạn không tìm thấy gì cả!).

AIX: không tìm thấy dấu hiệu nào từ tài liệu công khai.

HP-UX: giống như AIX.


Vì vậy, tôi sẽ tìm thấy /dev/fd/1một BSD liên kết đến hiện tại của tôi 1>? Một điều tôi thường làm trong linux là echo 'command' | . /dev/fd/0- đây có phải là thứ có khả năng hoạt động trên bảng không?
mikeerv

Tôi chưa truy cập vào hệ thống BSD ngay bây giờ, nhưng đó là cách tôi hiểu nó, vâng.
biện pháp đối phó

1
Nếu bạn tìm thấy thời gian chỉ để mở rộng thêm một chút nữa thì tôi sẽ chấp nhận câu trả lời này, tôi nghĩ rằng, việc chặn bất kỳ bài viết fd prof bất ngờ nào, đó là. Trong mọi trường hợp, bài viết đầu tiên được liên kết đến là một bài đọc khai sáng - cảm ơn bạn rất nhiều.
mikeerv

Vâng. Tôi đoán prof fd xuất hiện sau tất cả, phải không? Vì vậy, may mắn hơn lần tới?
mikeerv

1
Được rồi. Linux: / dev / fd / * là các liên kết tượng trưng đến / Proc / self / fd. FreeBSD: / dev / fd / * được cung cấp thông qua fdescfs. NetBSD: giống như FreeBSD. OpenBSD: giống như FreeBSD. Solaris: có / dev / fd / *. IRIX: có / dev / fd / *. Tru64 Unix: has / dev / fd / * (theo nixdoc.net , tài liệu Tru64 chính hãng tại HP không thể hiểu được). AIX: không tìm thấy dấu hiệu từ tài liệu có sẵn công khai. HP-UX: giống như AIX.
biện pháp đối phó
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.