2010-11-08 17 views
5

Tôi hỏi về linux với glibc gần đây.Linux: phát hiện khi chạy một quá trình có nhiều luồng

Có cách nào để phát hiện quy trình đó bao gồm 1 chuỗi hoặc một số luồng không?

Chủ đề có thể được tạo bởi pthread, hoặc clone trần(), vì vậy tôi cần một cái gì đó khá phổ quát.

UPD: Tôi muốn phát hiện các luồng của quá trình hiện tại từ chính nó.

+0

Trong chương trình của riêng bạn hoặc bên ngoài? – Duck

+0

Vịt, trong chương trình của tôi. – osgx

+0

Tôi phải hỏi: tại sao bạn chưa biết? Là một thư viện hoặc như vậy mở chúng dưới nắp? – Duck

Trả lời

11

Kiểm tra xem thư mục/proc/YOUR_PID/task/chỉ chứa một thư mục con. Nếu bạn có nhiều hơn một luồng trong quá trình sẽ có một số thư mục con.

Số lượng liên kết cứng có thể được sử dụng để đếm các thư mục phụ. Hàm này trả về số lượng hiện tại của chủ đề:

#include <sys/stat.h> 

int n_threads(void) 
{ 
    struct stat task_stat; 

    if (stat("/proc/self/task", &task_stat)) 
     return -1; 

    return task_stat.st_nlink - 2; 
} 
+0

Hmm ... Có. Có các luồng cho một số quy trình. Nhưng để lấy thông tin từ/proc tôi cần rất nhiều syscalls: opendir/readdir. Có cách nào dễ hơn không? – osgx

+1

@osgx: Bạn có thể làm điều đó với một syscall - chỉ cần 'stat ("/proc/self/task ")' và kiểm tra nếu 'st_nlink> 3'. – caf

+0

caf, Cảm ơn, nhưng không procfs duy trì số liên kết inode cho dirs? Bạn có kiểm tra phương pháp này không? – osgx

0

Tôi cho rằng bạn có thể chạy 'ps' (thông qua popen() hoặc tương tự) và phân tích sản lượng của nó, và xem có bao nhiêu lần ID của quá trình của bạn (như trả về bởi getpid()) xuất hiện trong đầu ra. Có thể có một cách tốt hơn, nhưng đó là điều đầu tiên xuất hiện trong đầu bạn.

+0

KHÔNG, xin vui lòng, không có bất kỳ tiến trình con nào bắt đầu :). Nó rất chậm, và tôi cần một cách nhanh chóng, như 1 syscall hoặc một số cờ đọc hoặc như vậy .. – osgx

0

/proc là cách tiêu chuẩn để thực hiện việc này trong Linux. Các công cụ như 'ps' hoạt động thông qua/proc. Trong Linux 2.6, bạn có thể tìm số chủ đề trong/proc/self/stat, nhưng không tương thích ngược.

0

Câu trả lời từ Victor chắc chắn là nhanh nhất, mặc dù bạn có thể muốn xem xét sử dụng thư viện ps thay thế.

Tên dưới Ubuntu là libprocps3-dev để bạn sử dụng cài đặt nó sử dụng:

sudo apt-get install libprocps3-dev 

Các tiêu đề được tìm thấy dưới /usr/include/proc.

Lưu ý rằng thư viện hoạt động bằng cách đọc/proc. Vì vậy, nó cũng giống như đọc các tập tin quan tâm trực tiếp, chỉ có nó sẽ biết sự khác biệt giữa các phiên bản khác nhau và chăm sóc đó dưới mui xe cho bạn.

Xem http://procps.sourceforge.net/index.html để biết chi tiết.

+0

Bao nhiêu cuộc gọi hệ thống sẽ làm procps để trả lời câu hỏi "quá trình bao gồm 1 sợi hoặc nhiều hơn 1 thread"? – osgx

+1

Trên câu trả lời chính, tôi thấy rằng nhiều người hỏi về vấn đề tương thích. procps chắc chắn là chậm, nhưng nên làm việc một cách minh bạch trên các phiên bản mới hơn và cũ hơn của Linux. Nó phụ thuộc vào việc bạn cần tốc độ hay tương thích lâu dài. –

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