2012-09-05 13 views
6

私はOSX Mountain Lionに所属しており、PIDを使用してプロセスの名前を取得しようとしています。PIDから名前を取得しますか?

次は私が使用していたコードです:

pid_t pid = 10687; 
char pathBuffer [PROC_PIDPATHINFO_MAXSIZE] = ""; 
char nameBuffer [256] = ""; 

int sizeOfVal = sizeof(nameBuffer); 
proc_pidpath(pid, pathBuffer, sizeof(pathBuffer)); 
proc_name(pid, nameBuffer, sizeof(nameBuffer)); 

NSLog(@"Path: %s\n Name: %s\n", pathBuffer, nameBuffer); 

上記のコードは正常に名を取得することができ、しかし、それは最初の15文字だけを取り出し、残りを「無視します」。これは名前の表示には問題ありませんが、で検索するととなります。この問題は、スタンドアロンアプリケーションで上記のコードをテストしているため、残りのアプリケーションでは発生しません。また、私はPIDを変更しようとしましたが、PIDに関係なく、コードは名前の最初の15文字だけを取得します。パス検索は完全に機能します。

誰かが私が間違っていることについてのアイデアはありますか?

+0

を、Iもう少し奇妙なことを発見した。指定されたバッファ長が32バイト未満の場合、名前が短くても(31バイトバッファに収まる)、文字列には何も配置されません。 – charliehorse55

答えて

8

この関数は、値が構造体proc_bsdshortinfoであることを調べます。ヌル終端文字を含む場合は、16バイトの文字列、または15個の読み取り可能な文字を返すように制限されています。 sys/param.hから

#define MAXCOMLEN 16  /* max command name remembered */ 

sys/proc_info.hから:

struct proc_bsdshortinfo { 
     uint32_t    pbsi_pid;  /* process id */ 
     uint32_t    pbsi_ppid;  /* process parent id */ 
     uint32_t    pbsi_pgid;  /* process perp id */ 
    uint32_t    pbsi_status;  /* p_stat value, SZOMB, SRUN, etc */ 
    char     pbsi_comm[MAXCOMLEN]; /* upto 16 characters of process name */ 
    uint32_t    pbsi_flags;    /* 64bit; emulated etc */ 
     uid_t     pbsi_uid;  /* current uid on process */ 
     gid_t     pbsi_gid;  /* current gid on process */ 
     uid_t     pbsi_ruid;  /* current ruid on process */ 
     gid_t     pbsi_rgid;  /* current tgid on process */ 
     uid_t     pbsi_svuid;  /* current svuid on process */ 
     gid_t     pbsi_svgid;  /* current svgid on process */ 
     uint32_t    pbsi_rfu;  /* reserved for future use*/ 
}; 

EDIT:この問題を回避するには、最後のパスコンポーネントを取得:私はこの問題を調査したよう

pid_t pid = 3051; 
char pathBuffer [PROC_PIDPATHINFO_MAXSIZE]; 
proc_pidpath(pid, pathBuffer, sizeof(pathBuffer)); 

char nameBuffer[256]; 

int position = strlen(pathBuffer); 
while(position >= 0 && pathBuffer[position] != '/') 
{ 
    position--; 
} 

strcpy(nameBuffer, pathBuffer + position + 1); 

printf("path: %s\n\nname:%s\n\n", pathBuffer, nameBuffer); 
+0

ありがとうございます。万一、これを回避する方法を知っていますか? – fdh

+0

フルパスを取得し、最後のパスコンポーネントまで文字列をトリミングします。 – charliehorse55

+0

より洗練されたソリューションはありませんか?プロセス情報の取得が多くのプログラムの重要な部分であることを考慮すると、そのような情報を取得するためのより効率的なインターフェースが必要です。 – fdh

関連する問題