CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN này sử dụng chương trình C để xuất thông tin sử dụng bộ nhớ của một tiến trình nhất định trong hệ thống Linux. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.
Lời nói đầu.
Chắc hẳn ai cũng từng gặp phải một tình huống nào đó. Trong công việc thực tế, đôi khi một chương trình cần in ra mức sử dụng bộ nhớ của một quy trình nhất định để tham khảo. Đây là chương trình tính toán mức sử dụng bộ nhớ của một quy trình nhất định thông qua hệ thống tệp giả /proc trong Linux. Cách thực hiện Không có nhiều điều để nói bên dưới, hãy cùng xem phần giới thiệu chi tiết.
Thực hiện phân tích.
Trước hết, tại sao lại có cái gọi là tệp giả? Các loại tệp trong hệ thống Linux có thể được chia đại khái thành ba loại: tệp thông thường, tệp thư mục và tệp giả không được sử dụng để lưu trữ dữ liệu, vì vậy các tệp này không được sử dụng. chiếm dung lượng ổ đĩa, nhưng Lives in Memory. /proc cho phép bạn tương tác với dữ liệu nội bộ của kernel và thu được thông tin hữu ích về quy trình.
Phần sau đây chủ yếu giới thiệu bốn tệp trong /proc: /proc/stat, /proc/meminfo, /proc//stat, /proc//status.
/proc/stat lưu trữ thời gian CPU của hệ thống. Tệp này chứa thông tin về tất cả các hoạt động của CPU.
?
1
2
3
4
5
6
7
8
|
CPU 72389 2891 16811 1148664 31374 0 67 0 0 0
cpu0 17608 452 3786 288899 6210 0 30 0 0 0
CPU1 18724 926 4598 285844 8911 0 15 0 0 0
CPU2 16803 658 3726 288710 7220 0 7 0 0 0
cpu3 19254 855 4700 285209 9032 0 13 0 0 0
...
...
...
|
/proc/meminfo lưu trữ thông tin bộ nhớ của hệ thống. Thông tin được biểu thị có thể được biết bằng tên của từng biến trong tệp.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Tổng bộ nhớ: 4046236 kB
Bộ nhớ miễn phí: 1054440 kB
MemCó sẵn: 2460060 kB
Bộ đệm: 359688 kB
Đã lưu trong bộ nhớ đệm: 1158056 kB
Đã hoán đổi: 0 kB
Hoạt động: 2020096 kB
Không hoạt động: 677948 kB
Đang hoạt động(anon): 1181376 kB
...
...
...
|
/proc//stat lưu trữ thông tin cpu của một tiến trình.
?
1
|
2476 (firefox) S 1773 1910 1910 0 -1 4210688 3413511 1712 757 1 45466 4629 2 7 20 0 57 0 20381 1774743552 150565 18446744073709551615 94844693012480 94844693126372 140732961864784 140732961858304 139747170914269 0 0 4096 33572079 0 0 0 17 2 0 0 1178 0 0 94844695226592 94844695228536 94844713955328 140732961867643 140732961867668 140732961867668 140732961869791 0
|
/proc//status lưu trữ thông tin cpu của một quy trình và một số thông tin toàn diện.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
Tên: firefox
Trạng thái: S (đang ngủ)
Bạn nói: 2476
Tôi nói: 0
Mã số: 2476
PPid: 1773
TracerPid: 0
Mã số: 1000 1000 1000 1000
Số lượng: 1000 1000 1000 1000
Kích thước FDS: 256
Nhóm: 4 24 27 30 46 108 124 1000
Mã số: 2476
Số lượng: 2476
NSpgid: 1910
NS: 1910
VmPeak: 1722812 kB
Kích thước Vm: 1690920 kB
VmLck: 0 KB
VmPin: 0 kB
VmHWM: 684048 kB
VmRSS: 600324 KB
Dữ liệu Vm: 993040 kB
VmStk: 192 kB
...
...
...
|
Dữ liệu trên có thể được lấy bằng cách đọc tệp. Dữ liệu tương ứng có thể được tính toán theo nhu cầu thử nghiệm của riêng bạn, chẳng hạn như pmem = VmRSS/MemTotal*100, v.v.
Mã mẫu.
Dưới đây chỉ là một ví dụ triển khai mã C đơn giản để lấy bộ nhớ thực tế bị chiếm bởi một tiến trình tại thời điểm hiện tại.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#include
#include
#include
#include
#include
#define VMRSS_LINE 21//Dòng chứa VMRSS Lưu ý: Vị trí có thể khác nhau tùy thuộc vào các hệ thống khác nhau.
#xác định pid_t int
số nguyên
lấy_bộ_thân_thực(
hằng số
pid_t p)
{
char
tập tin[64] = {0};
TÀI LIỆU
*fd;
char
dòng_buff[256] = {0};
chạy nước rút
(tài liệu,
"/proc/%d/trạng thái"
,P);
inf
(stderr,
"pid hiện tại:%d\n"
, P);
fd =
fopen
(tài liệu,
"r"
);
số nguyên
Tôi;
char
tên[32];
số nguyên
vmrss;
vì
(i=0;i
{
char
*đúng =
fgets
(dòng_buff,
kích thước của
(dòng đệm), fd);
}
char
* mạng1 =
fgets
(dòng_buff,
kích thước của
(dòng đệm), fd);
quét
(dòng_buff,
"%s %d"
, tên,&vmrss);
inf
(stderr,
"====%s:%d====\n"
, tên,vmrss);
đóng
(đăng ký);
trở lại
vmrss;
}
số nguyên
lấy_rmem(pid_t p)
{
trở lại
lấy_bộ_phận_thực(p);
}
số nguyên
lấy_tổng_bộ_nhớ()
{
hằng số
char
* tập tin =
"/proc/thông tin ghi nhớ"
;
TÀI LIỆU
*fd;
char
dòng_buff[256] = {0};
fd =
fopen
(tài liệu,
"r"
);
số nguyên
Tôi;
char
tên[32];
số nguyên
tổng số tiền;
char
*đúng =
fgets
(dòng_buff,
kích thước của
(dòng đệm), fd);
quét
(dòng_buff,
"%s %d"
, tên,&tổng số);
inf
(stderr,
"====%s:%d====\n"
, tên, tổng số hồ sơ);
đóng
(đăng ký);
trở lại
tổng số tiền;
}
|
tập tin kiểm tra
?
1
2
3
4
5
6
7
8
9
|
#include "get_mem.h"
số nguyên
chủ yếu()
{
số nguyên
danh sách[1024];
vì
(
số nguyên
i = 0; i < 1024; i++)
danh sách[i] = i;
số nguyên
bộ nhớ = get_rmem(getpid());
}
|
Tóm tắt.
Trên đây là toàn bộ nội dung bài viết mong rằng nội dung bài viết có giá trị tham khảo nhất định cho quá trình học tập, làm việc của mọi người. Nếu có thắc mắc gì có thể để lại tin nhắn để trao đổi.
Liên kết gốc: http://www.linuxidc.com/Linux/2017-12/149850.htm.
Cuối cùng, bài viết này về cách sử dụng chương trình C để xuất thông tin sử dụng bộ nhớ của một tiến trình trong hệ thống Linux kết thúc tại đây. Nếu bạn muốn biết thêm về cách sử dụng chương trình C để xuất thông tin sử dụng bộ nhớ của một tiến trình trong hệ thống Linux, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!