C语言获取进程路径:通过进程名称查找
C语言获取进程路径:通过进程名称查找
本文提供一个 C 语言代码示例,演示如何通过进程名称获取其可执行文件路径。该代码通过读取 /proc 文件系统中的进程信息实现。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <errno.h>
char* get_process_path(char* process_name) {
DIR* proc_dir = opendir("/proc");
if (proc_dir == NULL) {
printf("Failed to open /proc directory: %s\n", strerror(errno));
return NULL;
}
struct dirent* proc_entry;
while ((proc_entry = readdir(proc_dir)) != NULL) {
if (isdigit(*proc_entry->d_name)) {
char proc_path[256];
snprintf(proc_path, sizeof(proc_path), "/proc/%s/exe", proc_entry->d_name);
char exe_path[256];
ssize_t len = readlink(proc_path, exe_path, sizeof(exe_path));
if (len == -1) {
continue; // skip this entry
}
exe_path[len] = '\0';
char* exe_name = strrchr(exe_path, '/');
if (exe_name == NULL) {
continue; // skip this entry
}
exe_name++;
if (strcmp(exe_name, process_name) == 0) {
char* process_path = malloc(strlen(exe_path) + 1);
strcpy(process_path, exe_path);
closedir(proc_dir);
return process_path;
}
}
}
closedir(proc_dir);
return NULL;
}
int main(int argc, char** argv) {
if (argc != 2) {
printf("Usage: %s <process_name>\n", argv[0]);
return 1;
}
char* process_name = argv[1];
char* process_path = get_process_path(process_name);
if (process_path == NULL) {
printf("Failed to find process with name %s\n", process_name);
return 1;
}
printf("Process path: %s\n", process_path);
free(process_path);
return 0;
}
代码解释:
get_process_path函数:- 打开
/proc目录。 - 循环遍历
/proc目录下的所有条目,判断每个条目是否为数字(进程 ID)。 - 构建进程可执行文件路径
/proc/<pid>/exe。 - 使用
readlink函数读取该路径的符号链接,获取可执行文件路径。 - 解析可执行文件路径,提取可执行文件名,并与输入的进程名称进行比较。
- 如果匹配,则分配内存并复制可执行文件路径,并返回该路径。
- 打开
main函数:- 检查命令行参数数量,确保输入了进程名称。
- 调用
get_process_path函数获取进程路径。 - 打印获取到的进程路径或错误信息。
使用方法:
在命令行中输入进程名称,例如:
./get_process_path firefox
该代码将查找名为 firefox 的进程,并输出其可执行文件路径。
注意:
- 该代码依赖于 Linux 操作系统中的
/proc文件系统,可能无法在其他系统上运行。 - 该代码仅能获取运行中的进程的可执行文件路径,如果进程已结束,则无法获取其路径。
- 由于系统调用
readlink的限制,该代码可能无法获取所有进程的路径,例如,对于某些系统调用自身创建的进程,该代码无法获取其路径。
希望本文对您有所帮助。如果您还有其他问题,请随时提出。
原文地址: http://www.cveoy.top/t/topic/nnI2 著作权归作者所有。请勿转载和采集!