linux根据pid获取进程名和获取进程pid(c语言获取pid)


在Linux下,使用C语言根据PID获取进程名,以及获取当前进程的PID,可以通过以下方式实现:

### 获取当前进程的PID

在C语言中,你可以直接使用全局变量`getpid()`来获取当前进程的PID。这个函数定义在`unistd.h`头文件中。


#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid = getpid();
    printf("当前进程的PID是: %d\n", pid);
    return 0;
}

### 根据PID获取进程名

获取指定PID的进程名稍微复杂一些,因为进程名不是直接存储的,而是存储在进程的命令行参数中,你可以通过读取`/proc/[pid]/comm`文件或使用`/proc/[pid]/status`文件中的`Name:`字段来获取。但更常见的做法是使用`/proc/[pid]/cmdline`,它包含了完整的命令行参数,包括程序名(可能包含路径)。

以下是一个示例代码,展示如何根据PID获取进程名(注意:这里获取的可能是带有路径的完整命令):


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

char* get_process_name_by_pid(pid_t pid) {
    char path[64];
    snprintf(path, sizeof(path), "/proc/%ld/cmdline", (long)pid);
    FILE *file = fopen(path, "r");
    if (!file) {
        perror("打开文件失败");
        return NULL;
    }

    char buffer[1024];
    if (fgets(buffer, sizeof(buffer), file) != NULL) {
        // 去除字符串末尾的换行符和可能的空字符
        buffer[strcspn(buffer, "\n")] = 0;
        // 假设进程名是cmdline中的第一个参数,这里简单地以第一个空字符为分隔
        char *name = strtok(buffer, " \t\n");
        if (name) {
            return strdup(name); // 注意:返回的字符串需要用户释放
        }
    }
    fclose(file);
    return NULL;
}

int main() {
    pid_t pid = 1234; // 假设你要查询的进程PID是1234
    char *name = get_process_name_by_pid(pid);
    if (name) {
        printf("PID %ld 的进程名是: %s\n", (long)pid, name);
        free(name); // 释放之前复制的字符串
    } else {
        printf("无法获取PID %ld 的进程名\n", (long)pid);
    }
    return 0;
}

注意:这个示例代码简单地以第一个空白字符(空格、制表符、换行符)为分隔符来提取“进程名”,这在很多情况下是有效的,但并不总是准确。特别是在一些复杂的命令行参数或带有引号的参数情况下,这种方法可能会失效。在实际应用中,你可能需要更复杂的逻辑来准确解析`/proc/[pid]/cmdline`文件的内容。