Tôi hiện đã triển khai một trình theo dõi hoạt động đơn giản để xem tất cả các quy trình đang chạy trên iOS.Phát hiện ứng dụng nào hiện đang chạy trên iOS bằng sysctl
Để lấy một danh sách của tất cả các tiến trình đang chạy, tôi làm điều này:
size_t size;
struct kinfo_proc *procs = NULL;
int status;
NSMutableArray *killedProcesses = [[NSMutableArray alloc] init];
int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };
status = sysctl(mib, 4, NULL, &size, NULL, 0);
procs = malloc(size);
status = sysctl(mib, 4, procs, &size, NULL, 0);
// now, we have a nice list of processes
Và nếu tôi muốn biết thêm thông tin về một quy trình cụ thể, tôi sẽ thực hiện:
struct kinfo_proc *proc;
int mib[5] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pidNum, 0 };
int count;
size_t size = 0;
// ask the proc size
if(sysctl(mib, 4, NULL, &size, NULL, 0) < 0) return -1;
// allocate memory for proc
proc = (struct kinfo_proc *)malloc(size);
sysctl(mib, 4, proc, &size, NULL, 0);
Tất cả các phụ thông tin về proc Tôi muốn hiện được lưu trữ trong proc.
Tôi nhận thấy rằng các ứng dụng sẽ không bị hệ điều hành giết. Ngay cả khi ứng dụng không được sử dụng trong một thời gian dài (dài hơn 10 phút), ứng dụng sẽ vẫn nằm trong danh sách quy trình. Ngay cả khi tôi truy vấn quá trình "trạng thái" có (proc-> kp_proc.p_stat), nó trả về "đang chạy".
Câu hỏi của tôi là: không ai biết phương pháp phát hiện PID nào hiện đang chạy/đang được sử dụng (có thể: tăng thời gian CPU? Thời gian chạy? Bọ cpu, v.v.) ??
Trước tiên, tôi có một câu hỏi cho bạn. Khi giá trị của p_stat là 2, điều này có nghĩa là quá trình này đang chạy? Khi tôi chạy trên giả lập, tôi thấy một số quá trình có giá trị p_stat là 5. Ngoài ra, tôi thấy rằng tất cả các giá trị cho tick hoặc cpu time là 0. Có vẻ như những giá trị này không bao giờ là stat trong darwin. Tôi không biết liệu nó có giống nhau trong BSD miễn phí hay không. – HChen
Không. Giá trị dường như không thay đổi bất cứ nơi nào ... vì vậy không có dấu hiệu của một quá trình chạy từ sysctl cho đến nay – hackerdiehack
@hackerdiehack Bạn có biết làm thế nào để tìm ra khi quá trình này là tiền cảnh hoặc nền? –