2013-03-21 111 views
21

如何从他的pid获取进程名称? 例如,我执行cat file1.txt,但我想知道cat命令及其参数,因为它在系统中的pid。有没有一个结构来确定它或类似的东西?任何想法?Linux中的pid进程名称

+1

[通过PID获取进程名称]的可能重复(http://stackoverflow.com/questions/4189717/get-process-name-by-pid) – Hasturkun 2013-03-21 11:01:42

回答

22

没有任何通用的方法来做到这一点。每个操作系统都有不同的方式来处理它,有些非常困难。不过你提到Linux。使用Linux时,信息位于/ proc文件系统中。
要获取进程ID 9999的命令行,请阅读文件/proc/9999/cmdline

+10

而要获取进程ID 9999的进程名称,请阅读文件'/ proc/9999/comm'。 – 2013-07-05 15:02:16

+1

问题是如何获取进程名称,而不是命令行。在我的SUSE上,为kwrite进程输入'head/proc/9999/cmdline',并返回:'kdeinit4:kwrite [kdeinit]'。如果我使用/ comm而不是/ cmdline,我会得到正确的结果:'kwrite'。 – Elmue 2015-04-21 11:01:28

13

在linux上,你可以看看/proc/。尝试输入man proc获取更多信息。 /proc/$PID/cmdline的内容将为您提供运行过程$PID的命令行。还有/proc/self用于检查自己:)

另一种方法(例如在Mac OS X上)将使用libproc。请参阅libproc.h

+0

你能告诉我你的答案和我的区别吗? :) – Anubhab 2013-03-21 11:02:25

+9

当我开始写我的时,你的答案不存在:) – 2013-03-21 11:02:49

+0

HAHAHA ..:D .... – Anubhab 2013-03-21 11:03:37

8

POSIX C不支持给出一个标准API来获取PID的进程名称。

在Linux中,您可以通过LINUX Proc API获取名称:/ proc/$ PID/cmdline。并且代码看起来像这样:

const char* get_process_name_by_pid(const int pid) 
{ 
    char* name = (char*)calloc(1024,sizeof(char)); 
    if(name){ 
     sprintf(name, "/proc/%d/cmdline",pid); 
     FILE* f = fopen(name,"r"); 
     if(f){ 
      size_t size; 
      size = fread(name, sizeof(char), 1024, f); 
      if(size>0){ 
       if('\n'==name[size-1]) 
        name[size-1]='\0'; 
      } 
      fclose(f); 
     } 
    } 
    return name; 
} 
+1

如果你来这里寻找解决方案在C#与单声道工作,然后看看这个:http://stackoverflow.com/questions/29827331/workaround-for-bug-in-mono-wrong-process-processname-solved – Elmue 2015-04-23 15:32:38

6

为了得到一个进程ID的进程名说9000,使用这个命令:

ps -p 9000 -o comm= 
2

尽管这个问题已经回答了,我想加我2美分。

在我的情况下,当进程1111通过管道创建进程22222(至少这是我所听到的)时,/ proc/2222/cmdline没有给出正确的进程名称,而是给出了类似1111_1的东西。我必须使用/ proc/2222/comm来获取正确的进程名称。