Linux/UNIX编程:获取指定用户所有正在运行的进程ID和进程名
先用系统函数 `getpwnam` 获得指定用户名的 UID,然后遍历 /proc/ 中所有 PID 目录,如果 /proc/PID/status 中的 UID 是输入用户名对应的 UID 则输出该 status 文件中的进程名,进程ID就是目录名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <dirent.h> #include <unistd.h> #include <sys/fcntl.h> #include <pwd.h> int main( int argc, char const *argv[]) { //判断参数是否合法 if (argc != 2) { perror ( "Arguments error: lack of username" ); exit (EXIT_FAILURE); } //获得指定用户名的ID errno = 0; struct passwd *pwd = getpwnam(argv[1]); if (NULL == pwd){ if ( errno == 0){ char err_meg[50]; sprintf (err_meg, "Not found the user: %s" , argv[1]); } else { perror ( strerror ( errno )); } exit (EXIT_FAILURE); } uid_t uid = pwd->pw_uid; //printf("%d\n", uid); //打开目录 /proc DIR *dir = opendir( "/proc" ); if (NULL == dir){ perror ( strerror ( errno )); exit (EXIT_FAILURE); } errno = 0; struct dirent *pid_dir; while (pid_dir = readdir(dir)){ // puts(pid_dir->d_name); //是pid目录 if ((pid_dir->d_name)[0] <= '9' && (pid_dir->d_name)[0] >= '1' ){ //构造 /proc/PID/status 文件名 char status[50] = "/proc/" ; strcat (status, pid_dir->d_name); strcat (status, "/status" ); //打开 int fd = open(status, O_RDONLY); if (fd == -1){ perror ( strerror ( errno )); exit (EXIT_FAILURE); } //读取 char buffer[512]; read(fd, buffer, 512); char * uid_ptr = strstr (buffer, "Uid" ) + 5; //UID在字符'Uid'位置向后偏移5个字符 if ((uid_t)( strtol (uid_ptr, NULL, 10)) == uid){ //strtol:将字符形式的UID转换为long,然后再转换成uit_t int i = 6; //进程名的在status文件开头位置向后偏移6个字符 printf ( "%s\t" ,pid_dir->d_name); while (*(buffer + i) != '\n' ){ //输出进程名字 printf ( "%c" , *(buffer + i)); i++; } puts ( "" ); } //关闭 close(fd); } } if (0 != errno ){ perror ( "readdir" ); exit (EXIT_FAILURE); } closedir(dir); return 0; } |
标签:
Linux/UNIX编程
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用