2013-03-21 162 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來獲取正確的進程名稱。