2010-11-30 1 views

Répondre

28

Vous pouvez obtenir une liste des processus en cours et à partir des identifiants de processus peut être vous pouvez déterminer lesquels sont des processus système et lesquels sont des applications tierces, mais de toute façon je ne crois pas que vous pouvez l'utiliser dans l'application pour appstore . (Code tiré de here)

- (NSArray *)runningProcesses { 

    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0}; 
    size_t miblen = 4; 

    size_t size; 
    int st = sysctl(mib, miblen, NULL, &size, NULL, 0); 

    struct kinfo_proc * process = NULL; 
    struct kinfo_proc * newprocess = NULL; 

    do { 

     size += size/10; 
     newprocess = realloc(process, size); 

     if (!newprocess){ 

      if (process){ 
       free(process); 
      } 

      return nil; 
     } 

     process = newprocess; 
     st = sysctl(mib, miblen, process, &size, NULL, 0); 

    } while (st == -1 && errno == ENOMEM); 

    if (st == 0){ 

     if (size % sizeof(struct kinfo_proc) == 0){ 
      int nprocess = size/sizeof(struct kinfo_proc); 

      if (nprocess){ 

       NSMutableArray * array = [[NSMutableArray alloc] init]; 

       for (int i = nprocess - 1; i >= 0; i--){ 

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

        NSDictionary * dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:processID, processName, nil] 
                     forKeys:[NSArray arrayWithObjects:@"ProcessID", @"ProcessName", nil]]; 
        [processID release]; 
        [processName release]; 
        [array addObject:dict]; 
        [dict release]; 
       } 

       free(process); 
       return [array autorelease]; 
      } 
     } 
    } 

    return nil; 
}: 
+0

Merci. J'ai mis à jour la question. – Krishnan

+2

@Krishnan, ce code fonctionne sur un appareil non jailbreaké, mais Apple peut interdire l'utilisation de cette fonctionnalité dans l'application. Si vous ciblez le magasin Cydia vous pouvez le faire (je pense (mais pas sûr à 100%) J'ai vu une application qui fonctionne comme un gestionnaire de tâches - affichant toutes les applications en cours et permettant de les terminer) – Vladimir

+0

Merci pour cela. Si vous connaissez d'autres informations à ce sujet, merci de le partager. – Krishnan

2

Pourquoi voudriez-vous en boucle jusqu'à ce que vous exécutez mettre de la mémoire? Je pense que c'est beaucoup plus simple;)

size_t size; 
struct kinfo_proc *procs = NULL; 
int status; 

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); 
Questions connexes