以编程方式从iOS系统上的进程pid获取其他应用程序的目录路径?

时间:2012-04-15 06:21:58

标签: ios process

如何从进程pid获取其他应用程序的目录路径?

似乎iOS上没有proc_pidpath调用。

2 个答案:

答案 0 :(得分:3)

以下适用于iOS并使用sysctl像Activity Monitor Touch这样的应用程序在App Store中使用,因此Apple应该可以接受。但是,一旦你得到它,你打算用这条路做什么可能是Apple无法接受的。如果您不打算将应用程序提交到App Store,那么这可能不是问题。

- (NSString *)pathFromProcessID:(NSUInteger)pid {

    // First ask the system how big a buffer we should allocate
    int mib[3] = {CTL_KERN, KERN_ARGMAX, 0};

    size_t argmaxsize = sizeof(size_t);
    size_t size;

    int ret = sysctl(mib, 2, &size, &argmaxsize, NULL, 0);

    if (ret != 0) {
        NSLog(@"Error '%s' (%d) getting KERN_ARGMAX", strerror(errno), errno);            

        return nil;
    }

    // Then we can get the path information we actually want
    mib[1] = KERN_PROCARGS2;
    mib[2] = (int)pid;

    char *procargv = malloc(size);

    ret = sysctl(mib, 3, procargv, &size, NULL, 0);

    if (ret != 0) {
        NSLog(@"Error '%s' (%d) for pid %d", strerror(errno), errno, pid);            

        free(procargv);

        return nil;
    }

    // procargv is actually a data structure.  
    // The path is at procargv + sizeof(int)        
    NSString *path = [NSString stringWithCString:(procargv + sizeof(int))
                                        encoding:NSASCIIStringEncoding];

    free(procargv);

    return(path);
}

答案 1 :(得分:0)

iOS上的东西比这更受限制。如果您希望在应用程序之间共享文件,请考虑使用iCloud - 它允许您访问不同平台甚至不同应用程序的文件,因为应用程序所属的开发人员ID是相同的。 Ray Wenderlich写了一篇关于此问题的helpful tutorial。祝你好运!