2012-09-07 30 views
13

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.) ??

+0

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

+0

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

+1

@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? –

Trả lời

2

trả lời là "đang chạy" một phần của câu hỏi của bạn:

tôi đã sử dụng mã từ câu trả lời này Can we retrieve the applications currently running in iPhone and iPad

Nhìn sau khi tờ khai k_proc đây: http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/sys/proc.h

Với thử và sai phát hiện ra rằng các quá trình với tập p_flag là 18432 là ứng dụng hiện đang chạy (trong trường hợp này là thử nghiệm này).

Xem các liên kết đầu tiên, và thay thế bên trong của chu kỳ với:

if (process[i].kp_proc.p_flag == 18432){ 

         NSString * processID = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_pid]; 
         NSString * processName = [[NSString alloc] initWithFormat:@"%s", process[i].kp_proc.p_comm]; 
         NSString * status  = [[NSString alloc] initWithFormat:@"%d",process[i].kp_proc.p_flag ]; 

         NSDictionary * dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:processID, processName,status, nil] 
                      forKeys:[NSArray arrayWithObjects:@"ProcessID", @"ProcessName",@"flag", nil]]; 

         [array addObject:dict]; 

} 
+0

dường như không hoạt động đối với tôi ... làm thế nào để bạn kiểm tra điều này? Tôi đã thử những điều sau: kp_proc.p_flag == 18432 – hackerdiehack

+0

thật không may, điều này chỉ trả về ứng dụng hiện tại đang được gỡ lỗi: / – hackerdiehack

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