墨香年少 32 发布于 3月20日 通过/proc文件系统:Linux的/proc文件系统包含了系统运行时的各种信息,包括当前运行的进程信息。你可以遍历/proc目录下的每个子目录(以数字命名的目录,每个目录名对应一个进程ID),并读取其中的status文件来获取进程名称等信息。 使用popen和grep:通过执行ps -A命令并结合grep来搜索特定的进程名。如果命令的输出非空,则表示进程存在。这种方法适用于简单的场景,但可能不是最高效或最可靠的方式。 使用系统调用kill:通过发送信号0(不会结束进程)给指定的进程ID(如果你已知),如果调用成功,则表明进程存在。注意,这需要适当的权限。 检测进程使用的端口 读取/proc/net/tcp和/proc/net/udp文件:这些文件包含了当前系统TCP和UDP端口的使用情况。通过解析这些文件,可以找出特定进程正在监听或使用的端口。 使用lsof命令:lsof是一个列出打开文件的工具,对于网络连接,打开的“文件”是网络套接字。你可以通过popen执行lsof -i命令并解析输出来查找特定进程的端口使用情况。 示例代码 以下是一个使用C语言通过读取/proc文件系统来检测特定进程是否存在的简单示例。注意,这只是一个基本的例子,可能需要根据具体需求进行调整: #include <stdio.h> #include <dirent.h> #include <string.h> int process_exists(const char* process_name) { DIR *dir; struct dirent *ent; char buf[512]; // 打开/proc目录 if ((dir = opendir("/proc")) != NULL) { // 遍历/proc下的所有项 while ((ent = readdir(dir)) != NULL) { long pid; char cmdline[256]; FILE *fp; // 尝试将目录名转换为pid if ((pid = strtol(ent->d_name, NULL, 10)) > 0) { // 构建cmdline文件的路径 snprintf(cmdline, sizeof(cmdline), "/proc/%ld/cmdline", pid); // 尝试打开文件 if ((fp = fopen(cmdline, "r")) != NULL) { // 读取命令行内容 if (fgets(buf, sizeof(buf), fp) != NULL) { // 检查进程名称是否匹配 if (strstr(buf, process_name) != NULL) { fclose(fp); closedir(dir); return 1; // 找到进程 } } fclose(fp); } } } closedir(dir); } return 0; // 未找到进程 } int main() { const char* process_name = "your_process_name_here"; if (process_exists(process_name)) { printf("Process '%s' exists.\n", process_name); } else { printf("Process '%s' does not exist.\n", process_name); } return 0; } 目之所及,皆是回忆,心之所想,皆是过往 分享这篇帖子 链接帖子 分享到其他站点