get_name_by_pid


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

#define TMP_BUF_SIZE	1024

/**
 * 根據pid獲得進程名(不支持帶空格冒號的名字)
 * 參數:
 *   pid        [IN]:  進程pid
 *   proc_name  [OUT]: 進程名
 * 返回值:
 */
void
get_name_by_pid(pid_t pid, char *proc_name)
{
        char buf[TMP_BUF_SIZE];

        snprintf(buf, TMP_BUF_SIZE, "/proc/%d/cmdline", pid);
        FILE* fp = fopen(buf, "r");
        if(fp == NULL){
                return;
        }
        
        memset(buf, 0, TMP_BUF_SIZE);
        (void)fread(buf, 1, TMP_BUF_SIZE - 1, fp);
        fclose(fp);

        /* 去空格等干擾字符 */
        size_t tmp_len = strlen(buf);
        int i = 0;
        for (; i <= tmp_len; ++i){
                if (buf[i] == ' ' || buf[i] == ':'){
                        buf[i] = '\0';
                        break;
                }
        }

        tmp_len = strlen(buf);
        i = tmp_len;
        /* 提取進程名 */
        for (; i >= 0; --i){
                if (buf[i] == '/'){
                        break;
                }
        }

        strncpy(proc_name, &buf[i + 1], TMP_BUF_SIZE - 1);
        proc_name[TMP_BUF_SIZE - 1] = '\0';
}

int main()
{
    char proc_name[1024];
    get_name_by_pid(getpid(), proc_name);
    printf("%s\n", proc_name);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章