2010-03-25 34 views

Trả lời

8

TechZen nói: Các Process Manager là, tính đến tháng 12 năm 2013, hoàn toàn phản đối.

Ah, tôi chỉ tìm thấy Process Manager reference

Hình như GetNextProcessGetProcessInfo giúp đỡ trong việc tìm hiểu những gì đang chạy. Theo đề nghị của Dave, GetBSDProcessList có thể được sử dụng nếu bạn đang tìm kiếm daemon và không chỉ các quy trình Carbon/Cocoa.

+0

Bạn có thể không muốn sử dụng các chức năng cũ hơn vì Apple có thể chọn không dùng nữa. Các lớp cacao nói chung là an toàn hơn về mặt này. – ericg

+1

FYI, 'GetBSDProcessList' là * nhiều * nhanh hơn việc lặp lại thông qua Trình quản lý Quy trình. –

+2

Trình quản lý quy trình hiện không được chấp nhận và có sẵn trong 64 bit. Tôi không nghĩ rằng nó có một cái rìu trên đầu nó theo cách mà một số API khác có. –

7

Có một vài cách bạn có thể làm điều này:

  1. Nếu đó là một ứng dụng GUI với một biểu tượng Dock, sử dụng -[NSWorkspace launchedApplications].
  2. Ngắt một quy trình khác (như ps hoặc trên hoặc bất kỳ thứ gì) qua số NSTask, đọc kết quả và tìm kiếm chính mình (hoặc đặt ống dẫn thông qua grep hoặc thứ gì đó).
  3. Sử dụng GetBSDProcessList chức năng được mô tả ở đây: http://developer.apple.com/legacy/mac/library/#qa/qa2001/qa1123.html (Tôi đã sử dụng này thành công trong quá khứ)
+2

Hi Dave, Bất kỳ cơ hội bạn có thể đào lên một cập nhật liên kết? Dường như Apple đã sắp xếp lại trang web nhà phát triển của họ, liên kết không còn hoạt động nữa. Cảm ơn! –

2

Trong tổng quan về các NSRunningApplicationClass, nó nói:

NSRunningApplication là một lớp học để thao tác và cung cấp thông tin cho một trường hợp duy nhất của một ứng dụng. Chỉ các ứng dụng người dùng được theo dõi; điều này không cung cấp thông tin về mọi quá trình trên hệ thống.

Để truy cập vào danh sách của tất cả các ứng dụng đang chạy, sử dụng phương pháp runningApplications trong NSWorkspace.

tôi sẽ đề nghị tham gia một cái nhìn tại Workspace Services Programming Topics

+0

Đó là điều tuyệt vời, nếu bạn có thể giới hạn bản thân đối với các ứng dụng GUI trên 10.6 –

14

Dưới đây là một số hiện thực và chi tiết cụ thể, lưu ý rằng proc-> kp_proc.p_comm có một giới hạn độ dài nhân vật đó là lý do tại sao tôi đang thực hiện infoForPID: thay vì

Cocoa:

[NSWorkspace launchedApplications] (10.2+, không dùng nữa tại 10.7, niêm yết quá trình rất hạn chế) [NSWorkspace runningApplications] (10.6 +, quá trình ít hạn chế niêm yết nhưng vẫn không bao gồm các quy trình daemon)

Carbon:

- (NSArray*)getCarbonProcessList 
{ 
    NSMutableArray *ret = [NSMutableArray arrayWithCapacity:1]; 
    ProcessSerialNumber psn = { kNoProcess, kNoProcess }; 
    while (GetNextProcess(&psn) == noErr) { 
     CFDictionaryRef cfDict = ProcessInformationCopyDictionary(&psn, kProcessDictionaryIncludeAllInformationMask); 
     if (cfDict) { 
      NSDictionary *dict = (NSDictionary *)cfDict; 
      [ret addObject:[NSDictionary dictionaryWithObjectsAndKeys: 
          [NSString stringWithFormat:@"%@",[dict objectForKey:(id)kCFBundleNameKey]],@"pname", 
          [NSString stringWithFormat:@"%@",[dict objectForKey:@"pid"]],@"pid", 
          [NSString stringWithFormat:@"%d",(uid_t)getuid()],@"uid",            
          nil]]; 
      CFRelease(cfDict);   
     } 
    } 
    return ret; 
} 

C: (xem Technical Q&A QA1123 Getting List of All Processes on Mac OS X)

- (NSArray*)getBSDProcessList 
{ 
    NSMutableArray *ret = [NSMutableArray arrayWithCapacity:1]; 
    kinfo_proc *mylist; 
    size_t mycount = 0; 
    mylist = (kinfo_proc *)malloc(sizeof(kinfo_proc)); 
    GetBSDProcessList(&mylist, &mycount); 
    int k; 
    for(k = 0; k < mycount; k++) { 
     kinfo_proc *proc = NULL; 
     proc = &mylist[k]; 
     NSString *fullName = [[self infoForPID:proc->kp_proc.p_pid] objectForKey:(id)kCFBundleNameKey]; 
     if (fullName == nil) fullName = [NSString stringWithFormat:@"%s",proc->kp_proc.p_comm]; 
     [ret addObject:[NSDictionary dictionaryWithObjectsAndKeys: 
         fullName,@"pname", 
         [NSString stringWithFormat:@"%d",proc->kp_proc.p_pid],@"pid", 
         [NSString stringWithFormat:@"%d",proc->kp_eproc.e_ucred.cr_uid],@"uid",            
         nil]];            
    } 
    free(mylist); 
    return ret; 
} 

- (NSDictionary *)infoForPID:(pid_t)pid 
{ 
    NSDictionary *ret = nil; 
    ProcessSerialNumber psn = { kNoProcess, kNoProcess }; 
    if (GetProcessForPID(pid, &psn) == noErr) { 
     CFDictionaryRef cfDict = ProcessInformationCopyDictionary(&psn,kProcessDictionaryIncludeAllInformationMask); 
     ret = [NSDictionary dictionaryWithDictionary:(NSDictionary *)cfDict]; 
     CFRelease(cfDict); 
    } 
    return ret; 
} 
+1

Liên kết của bạn bị hỏng. – Will

+0

điều này tương đương với việc sử dụng NSArray * runningApp = [[NSWorkspace sharedWorkspace] runningApplications]; và không làm việc để có được danh sách các quy trình Daemon đang chạy. – willyMon

+0

@willyMon có nó tương đương với runApplications nhưng nó hoàn toàn hơn so với danh sách từ launchApplications, phương pháp C cung cấp cho bạn các daemon quá – valexa

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