2009-08-22 36 views
10

Làm cách nào để tìm tất cả các tệp đang mở trong một quy trình (từ bên trong chính nó)?Đóng tất cả các tệp đang mở trong một quá trình

Điều này có vẻ hữu ích khi biết sau fork() (trước exec()).

tôi biết sự tồn tại của getdtablesize() và di động hơn sysconf(_SC_OPEN_MAX), nhưng có vẻ như không hiệu quả để cố gắng đóng cửa tất cả các tập tin mô tả hợp lệ, cho dù có một tập tin mở đằng sau nó hay không. (Tôi cũng biết về sự nguy hiểm của việc tối ưu hóa sớm, đây là nhiều hơn về tính thẩm mỹ mà tôi đoán :-)

Trả lời

3

Nghe có vẻ không hiệu quả khi cố gắng đóng tất cả các bộ mô tả tập tin, nhưng nó thực sự không tệ. Việc thực hiện cuộc gọi hệ thống để tra cứu một bộ mô tả tập tin sẽ khá hiệu quả nếu hệ thống là bất kỳ tốt.

Nếu bạn muốn tìm chỉ đóng các bộ mô tả tệp đang mở, bạn có thể sử dụng hệ thống tệp proc trên các hệ thống mà nó tồn tại. Ví dụ. trên Linux,/proc/self/fd sẽ liệt kê tất cả các mô tả tệp mở. Lặp lại thư mục đó và đóng mọi thứ> 2, không bao gồm bộ mô tả tệp biểu thị thư mục bạn đang lặp lại.

8

Nếu chương trình của bạn sẽ được gọi forkexec, bạn thực sự cần mở tất cả các file descriptor với O_CLOEXEC cờ, do đó bạn không cần phải tự đóng chúng trước khi exec. Bạn cũng có thể sử dụng fcntl để thêm cờ này sau khi tệp được mở, nhưng điều đó tùy thuộc vào điều kiện chủng tộc trong các chương trình đa luồng.

+0

Chào mừng bạn đến với các cuộc đua. – ybungalobill

Các vấn đề liên quan