2011-11-17 24 views

Trả lời

6

Trên một số hệ thống nhất định (xem bên dưới), bạn có thể đếm chúng trong/proc/[pid]/fd. Nếu không có một trong số đó, hãy xem bên dưới cho: wallyk's answer.

Trong c, bạn có thể liệt kê các thư mục và đếm tổng số, hoặc liệt kê các nội dung dir:

#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 

int 
main (void) 
{ 
    DIR *dp; 
    struct dirent *ep; 

    dp = opendir ("/proc/MYPID/fd/"); 
    if (dp != NULL) 
    { 
     while (ep = readdir (dp)) 
     puts (ep->d_name); 
     (void) closedir (dp); 
    } 
    else 
    perror ("Couldn't open the directory"); 

    return 0; 
} 

Trong bash, một cái gì đó như:

Hệ điều hành
ls -l /proc/[pid]/fd/ | wc -l 

có hỗ trợ hệ thống tệp proc bao gồm, nhưng là không giới hạn ở:
Solaris
IRIX
Tru64 UNIX
BSD
Linux (mà mở rộng nó để dữ liệu không quá trình liên quan đến)
IBM AIX (mà căn cứ thực hiện của nó trên Linux để cải thiện khả năng tương thích)
QNX
Plan 9 từ Bell Labs

+2

Đây không phải là di động để ví dụ: Các hệ thống FreeBSD vì chúng không có hệ thống tập tin/proc /. Ngoài ra: Điều này không trả lời câu hỏi của OP. – arne

+0

Tôi thích câu trả lời của wallyk, nó là xách tay hơn, và dựa vào rất ít cơ sở được cung cấp bởi hệ thống con. Nhưng, trong trường hợp của tôi, tôi cần phải chắc chắn rằng các nỗ lực để đếm tập tin xử lý có một cơ hội cao để thành công; tức là không phải mở và đóng nhiều tập tin xử lý hơn. Trong ý nghĩa đó, giải pháp của chown là tốt hơn, vì nó chỉ sử dụng một tập tin xử lý nhiều hơn trong nỗ lực này. –

+2

@CodeMedic: giải pháp wallyk chỉ yêu cầu một trình xử lý tệp bổ sung bất kỳ lúc nào khi nó mở và đóng nó bên trong vòng lặp. – salva

0

Không có di động cách để nhận số lượng mô tả mở (bất kể loại), trừ khi bạn tự theo dõi chúng.

6

Một ý tưởng mà nói đến cái tâm mà nên làm việc trên bất kỳ hệ thống * nix là:

int j, n = 0; 

// count open file descriptors 
for (j = 0; j < FDMAX; ++j)  // FDMAX should be retrieved from process limits, 
            // but a constant value of >=4K should be 
            // adequate for most systems 
{ 
    int fd = dup (j); 
    if (fd < 0) 
     continue; 
    ++n; 
    close (fd); 
} 
printf ("%d file descriptors open\n", n); 
+0

Cách tiếp cận tàn bạo, nhưng rất thú vị. Nó không phân biệt giữa các tập tin "thực" và các thiết bị ký tự khác như thiết bị đầu cuối và ổ cắm. – arne

+4

@arne: OP không yêu cầu sự khác biệt. Chỉ tổng số các chốt xử lý mở. – wallyk

+1

Điều đó chắc chắn đúng, nhưng trong trường hợp anh ta quên, tôi đã đề cập đến nó. – arne

1

OpenSSH thực hiện một chức năng closefrom rằng làm điều gì đó rất giống với những gì bạn cần trộn hai cách tiếp cận đã được wallyk đề xuất và chown và OpenSSH rất dễ sử dụng, ít nhất là giữa các hệ thống Unix/Linux/BSD/Cygwin.

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