8

私は OSX Mountain Lion を使用しており、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 文字しか取得しません。パス検索は完璧に機能します。

私が間違っていることについて何か考えがある人はいますか?

4

1 に答える 1

11

関数が値を見るのは structproc_bsdshortinfoです。null ターミネータを含めると、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*/
};

編集:これを回避するには、最後のパス コンポーネントを取得します。

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);
于 2012-09-05T04:43:11.133 に答える