Inotify có thể được sử dụng để xem một tập tin cụ thể được tạo mà không cần theo dõi toàn bộ thư mục không?


9

Tôi muốn được thông báo khi một tên tệp cụ thể được tạo. Tôi đang nhìn inotify. Các IN_CREATElá cờ có sẵn để theo dõi một thư mục cho bất kỳ thay đổi bên trong nó, nhưng tôi không muốn theo dõi toàn bộ thư mục từ có thể có một thỏa thuận tốt về hoạt động trong thư mục đó bên cạnh các tập tin tôi đang quan tâm. Điều này có thể được thực hiện ?


3
Tôi đoán câu trả lời là 'không'. Ít nhất là không với inotify. Nếu bạn có thể kiểm soát vị trí của tệp, tốt hơn hết bạn nên tạo một thư mục đặc biệt chỉ dành cho nó, để bạn có thể theo dõi thư mục mà không bị đánh thức bởi những phiền nhiễu. Nếu bạn không thể kiểm soát vị trí, bạn đang phải đối mặt với một trong hai so sánh 'tên' lĩnh vực trở chống lại tên (tương đối) của tập tin của bạn, hoặc một cái gì đó gọi khác như accessvới F_OKđể xem nếu nó tồn tại được nêu ra.
BobDoolittle

Câu trả lời:


7

Bạn không thể có kernel chỉ thông báo cho bạn về một thay đổi đối với một đường dẫn nhất định. Những lý do hơi tinh tế:

  • Trong Linux, một đối tượng tệp tồn tại độc lập với bất kỳ tên nào mà nó có thể có. Tên của tệp thực sự là thuộc tính của thư mục chứa của chúng và một tệp có thể được gọi bằng nhiều tên (xem, liên kết cứng).

  • Nhân phải có một cái gì đó để gắn các đối tượng inotify vào; nó không thể đính kèm một đối tượng vào một tên đường dẫn vì một tên đường dẫn không phải là một đối tượng hệ thống tập tin thực sự; bạn phải đính kèm vào thư mục mẹ hoặc tệp mà đường dẫn mô tả. Nhưng bạn không thể đính kèm vào tệp, bởi vì bạn đang xem để xem liệu một tệp có tên đã cho có được tạo không, không thay đổi thành tệp đã cho.

Về mặt lý thuyết, hạt nhân có thể triển khai API cho phép bạn chọn các sự kiện cho một tên đường dẫn cụ thể khi thêm đồng hồ vào thư mục, giống như cách nó cho phép bạn chọn các loại sự kiện. Điều này sẽ làm phình to API và cuối cùng, hạt nhân sẽ xử lý cùng một dữ liệu và thực hiện cùng một chuỗi so sánh bạn sẽ làm trong không gian người dùng.

Có một hiệu suất đáng chú ý để đặt một chiếc đồng hồ trên một thư mục rất tích cực? Tôi không chắc bạn có ý nghĩa như thế nào; Hàng chục tập tin một giây, hàng trăm, hàng triệu?

Trong mọi trường hợp, tôi sẽ tránh access: nó sẽ luôn luôn là cuộc đua. Một tập tin có thể được tạo và loại bỏ giữa các cuộc gọi đến accessvà việc gọi accesstrong một vòng lặp rất chặt chẽ sẽ bị chậm và là loại vấn đề inotifyđược thiết kế để giải quyết.


Nếu tôi không thể được thông báo về "một sự thay đổi theo một con đường nhất định", làm thế nào để inotot hoạt động? Có lẽ bạn đang đề cập đến đường dẫn tệp cụ thể nhưng không phải đường dẫn thư mục?
BobDoolittle

Ngoài ra, lợi thế của việc kiểm tra kernel chứ không phải không gian người dùng là nếu có nhiều tiến trình giám sát thư mục. Thay vì bối cảnh chuyển đổi tất cả chúng một cách không cần thiết và có tất cả chúng làm một phép so sánh, bạn chỉ có thể chuyển đổi trong quá trình thực sự quan tâm đến đường dẫn tệp được đề cập.
BobDoolittle

Tôi có nghĩa là khi theo dõi một thư mục (rõ ràng được đưa ra bởi một đường dẫn), bạn không thể yêu cầu kernel chỉ chọn các sự kiện có tên đã cho (vì vậy, tôi đang đề cập đến các đường dẫn 'tệp'). Tôi hiểu những lợi ích về mặt lý thuyết của việc không đánh thức một loạt các quy trình, nhưng tôi phải hỏi lại xem bạn đã thử sử dụng chưa inotify, và liệu hiệu suất có phải là một vấn đề thực sự không.
Dylan Frese

1
Ngoài ra, nếu nhiều quy trình quan tâm đến một số sự kiện nhất định, bạn có thể có một quy trình xem tên tệp và gửi các sự kiện 'thú vị' qua một thứ như ổ cắm UNIX đến các quy trình thực sự quan tâm đến các sự kiện này (như một loại dịch vụ).
Dylan Frese

Các vấn đề về hiệu suất có thể cực kỳ khó đo lường và chẩn đoán. Thay vì bước vào những bức tường gạch, tôi thích áp dụng các thực hành lập trình tốt ngay từ đầu, phát triển phần mềm sử dụng các mẫu thiết kế tốt và tránh các tình huống như vậy. Vì vậy, không, tôi đã không quan sát một vấn đề. Tôi đã lường trước một vấn đề tiềm ẩn và tránh sử dụng inotify trong trường hợp này do tiềm ẩn các vấn đề. Là một nhà phát triển phần mềm hệ thống, tôi tin vào việc cung cấp các cơ chế mạnh mẽ để giúp mọi người tránh các vấn đề về hiệu suất, đó là mục đích của việc kích thích.
BobDoolittle
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.