从c / cpp程序中的进程ID获取进程名称(我不能使用/ proc / <pid> / cmdline)</pid>

时间:2014-07-21 12:43:11

标签: c++ c linux pid

我知道这个问题已被问过几次,但不幸的是我找不到符合我限制的答案。

我有一个PID( 我的过程),我想找到它的名字。现在,我无法访问/proc/<pid>/cmdline(限制),除了将其输出发送到文件之外,我无法找到在我的程序中获取ps输出的方法。然后解析它(我需要避免)。

还有其他选择吗?

我在C / C ++的Linux / Android用户空间编码

2 个答案:

答案 0 :(得分:3)

听起来ps 工作(?),但您无法写入临时文件。 (为什么?也许AppArmor限制只访问某些进程?)

如果这是真的,那么您可以使用管道直接将ps输出读入您的程序,而无需临时文件。

int fds[2];
pipe(fds);

int pid = fork();
if (pid == 0) {
  // child
  close(fds[0]);  // close the read end of the pipe in the child
  dup2(1,fds[1]); // move the write end to be stdout
  close(fds[1]);

  execlp("ps", "ps", "-p", "blah", NULL);
} else {
  // parent
  close(fds[1]);  // close the write end of the pipe in the parent.

  // read data from fds[0] here

  close(fds[0]);
  int status;
  wait(&status); // clean up the zombie ps process
}

该示例省略了所有错误检查(您必须添加),并且可能不允许(取决于您的访问限制的性质)。

答案 1 :(得分:0)

如果您使用Android,并且您没有root权限,则可以尝试使用此功能:

public static String getAppName(Context ctx, int PID){
    ActivityManager mng
               = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);

    for(RunningAppProcessInfo processInfo : mng.getRunningAppProcesses()){
        if(processInfo.pid == PID){
            return processInfo.processName;
        }
    }
    return "not found PID";
}