2013-08-23 49 views
5

Tôi mới sử dụng lập trình mô-đun và tôi cần thực hiện cuộc gọi hệ thống để truy xuất các quy trình hệ thống và hiển thị lượng CPU mà chúng đang tiêu thụ.Gọi hệ thống để lấy danh sách các quy trình

Tôi làm cách nào để thực hiện cuộc gọi này?

+0

Bạn đang đề cập đến lệnh 'top'? – alfasin

+0

Đầu ra giống như lệnh trên cùng, nhưng tôi cần thực hiện cuộc gọi hệ thống để thực hiện điều đó. – douglasd3

Trả lời

13

Tại sao bạn triển khai một cuộc gọi hệ thống cho điều này? Bạn không muốn thêm một syscall vào API Linux hiện có. Đây là giao diện Linux chính cho không gian người dùng và không ai chạm vào syscalls ngoại trừ các nhà phát triển hạt nhân hàng đầu biết những gì họ làm.

Nếu bạn muốn nhận danh sách các quy trình và thông số của chúng cũng như trạng thái thời gian thực, hãy sử dụng /proc. Mỗi thư mục là một số nguyên trong đó là một ID tiến trình hiện có và chứa một loạt các tệp động hữu ích mà ps, top và các tệp khác sử dụng để in đầu ra của chúng.

Nếu bạn muốn nhận danh sách các quy trình trong hạt nhân (ví dụ: trong mô-đun), bạn nên biết rằng các quy trình được giữ trong nội bộ dưới dạng danh sách được liên kết kép bắt đầu bằng quy trình init (biểu tượng init_task trong hạt nhân) . Bạn nên sử dụng các macro được xác định trong include/linux/sched.h để nhận các quy trình. Dưới đây là ví dụ:

#include <linux/module.h> 
#include <linux/printk.h> 
#include <linux/sched.h> 

static int __init ex_init(void) 
{ 
    struct task_struct *task; 

    for_each_process(task) 
     pr_info("%s [%d]\n", task->comm, task->pid); 

    return 0; 
} 

static void __exit ex_fini(void) 
{ 
} 

module_init(ex_init); 
module_exit(ex_fini); 

Điều này sẽ không sao để thu thập thông tin. Tuy nhiên, không thay đổi bất cứ điều gì trong đó, trừ khi bạn thực sự biết những gì bạn đang làm (mà sẽ đòi hỏi một chút đọc nhiều hơn).

+0

bạn có thể cung cấp một số giải thích về cách sử dụng và cách hoạt động của nó –

+0

Vâng, bạn phải có nhiệm vụ bắt đầu. Nó thường được thực hiện bởi "hiện tại", đó là một marco. Với điều này, bạn có thể nhận nhiệm vụ hiện đang chạy. Nó sẽ trở lại với một nhiệm vụ. Sau đó, bạn có thể bắt đầu lặp lại ngay bây giờ với nó. – Wandy

0

Có syscalls cho điều đó, được gọi là mở và đọc. Thông tin của tất cả các quy trình đều được lưu giữ trong các thư mục /proc/{pid}. Bạn có thể thu thập thông tin quy trình bằng cách đọc các tệp tương ứng.

Được giải thích thêm tại đây: http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html