task_for_pid总是在C中的darwin上返回(os / kern)失败

时间:2011-07-12 04:32:19

标签: c ios darwin mach-o

由于某些原因,我无法从task_for_pid()中获得任何结果 我找不到很多信息,但是我想要做的是将它附加到另一个进程并搜索它的内存,但每次我尝试使用task_for_pid时,都会得到相同的(os / kern)失败错误。

#include <stdio.h>
#include <mach/mach_traps.h>
#include <mach/mach_init.h>

int main(int argc, char* argv[])
{
mach_port_name_t task;
printf("%d\n", argv[1]);
int pid = atoi(argv[1]);
printf("%d\n%d\n", pid, current_task());
int error = task_for_pid(2055, 24269, &task);
printf("%x\n", task);
if (error)
{
printf("task_for_pid return error:\n %s\n", mach_error_string(error));
} else {
printf("Get the process %d's task port : %x\n", pid, task);
}
return 0;
}

输出如下:

gcc -o test test.c;./test 24269
803206115
24269
2055
0
task_for_pid return error:
 (os/kern) failure

任何想法都是为什么我不能完成任务? 我是以root身份运行它。

正如亚当罗森菲尔德所说,它确实在标题中说它已经过时了,但如果这是真的,我还能编译并运行旧版本的工具链吗?或者它被取代了什么?有人知道吗?

1 个答案:

答案 0 :(得分:2)

  1. 您确定以root身份运行吗?
  2. 您确定进程24269是否仍在运行?
  3. 使用任何正在运行的进程在Mac OS X 10.6.8上运行此代码(使用sudo)都没有问题:

    #include <stdio.h>
    #include <stdlib.h>
    #include <mach/mach_traps.h>
    #include <mach/mach_init.h>
    #include <mach/mach_error.h>
    
    int main(int argc, char* argv[])
    {
        task_t task;
        pid_t pid = argc >= 2 ? atoi(argv[1]) : 1;
        kern_return_t error = task_for_pid(current_task(), pid, &task);
        printf("%d -> %x [%d - %s]\n", pid, task, error, mach_error_string(error));
        return error;
    }
    

    例如,这是我的pid 182(Dock)

    的结果
    $ sudo ./task_for_pid 182
    182 -> 413 [0 - (os/kern) successful]