2011-11-15 27 views
5

Tôi muốn chương trình (C/C++) của tôi hiển thị một chỉ số bằng số hiện có bao nhiêu tiến trình trên hệ thống cục bộ. Giá trị số lượng quy trình chạy sẽ được truy vấn thường xuyên (ví dụ: một lần mỗi giây) để cập nhật hiển thị của tôi.Có cách nào nhẹ để có được số lượng Quy trình hiện tại trong Linux không?

Có cách nào nhẹ để lấy số đó không? Rõ ràng tôi có thể gọi "ps ax | wc -l", nhưng tôi không muốn ép buộc máy tính tạo ra một quá trình và phân tích hàng trăm dòng văn bản chỉ để tìm ra một số nguyên duy nhất.

Chương trình này sẽ chạy chủ yếu dưới Linux, nhưng cũng có thể chạy dưới MacOS/X hoặc Windows, vì vậy các kỹ thuật liên quan đến các hệ điều hành đó cũng sẽ hữu ích.

Lý tưởng nhất là tôi đang tìm kiếm một cái gì đó giống như this, ngoại trừ có sẵn trong Linux (getsysinfo() dường như là nhiều hơn một điều Minix)

Cảm ơn, Jeremy

+0

thể trùng lặp của [Linux API để liệt kê các tiến trình đang chạy?] (Http://stackoverflow.com/questions/939778/linux-api-to-list-running-processes) –

+0

như ở đây: [http: //stackoverflow.com/questions/939778/linux-api-to-list-running-processes]? –

+1

Tôi không muốn danh sách các tiến trình đang chạy, chỉ cần đếm. –

Trả lời

12

.... và tất nhiên 1 phút sau khi tôi đăng câu hỏi, tôi tìm ra câu trả lời: sysinfo sẽ trả về (trong số những thứ khác) một trường cho biết có bao nhiêu quy trình.

Điều đó nói rằng, nếu có ai biết về MacOS/X và/hoặc Windows tương đương với sysinfo(), tôi vẫn quan tâm đến điều đó.


Cập nhật: Đây là hàm tôi cuối cùng đã kết thúc.

#ifdef __linux__ 
# include <sys/sysinfo.h> 
#elif defined(__APPLE__) 
# include <sys/sysctl.h> 
#elif defined(WIN32) 
# include <Psapi.h> 
#endif 

int GetTotalNumProcesses() 
{ 
#if defined(__linux__) 
    struct sysinfo si; 
    return (sysinfo(&si) == 0) ? (int)si.procs : (int)-1; 
#elif defined(__APPLE__) 
    size_t length = 0; 
    static const int names[] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0}; 
    return (sysctl((int *)names, ((sizeof(names)/sizeof(names[0]))-1, NULL, &length, NULL, 0) == 0) ? (int)(length/sizeof(kinfo_proc)) : (int)-1; 
#elif defined(WIN32) 
    DWORD aProcesses[1024], cbNeeded; 
    return EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded) ? (cbNeeded/sizeof(DWORD)) : -1; 
#else 
    return -1; 
#endif 
} 
+0

+1, điều đó thực sự dễ dàng hơn nhiều so với đề xuất của tôi. –

3

opendir("/proc") và đếm số lượng các mục đó là các thư mục và có tên chỉ có chữ số.

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