博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux/UNIX编程:获取指定用户所有正在运行的进程ID和进程名
阅读量:7222 次
发布时间:2019-06-29

本文共 1728 字,大约阅读时间需要 5 分钟。

 

先用系统函数 `getpwnam` 获得指定用户名的 UID,然后遍历 /proc/ 中所有 PID 目录,如果 /proc/PID/status 中的 UID 是输入用户名对应的 UID 则输出该 status 文件中的进程名,进程ID就是目录名。

 

#include 
#include
#include
#include
#include
#include
#include
#include
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(strerror(errno)); exit(EXIT_FAILURE); } closedir(dir); return 0;}

  

转载于:https://www.cnblogs.com/yuanyb/p/11073519.html

你可能感兴趣的文章
java 颠倒整数
查看>>
Python入门教程100天:Day05-练习总结
查看>>
环境搭建,8种基本类型,Static,package和import,log4j
查看>>
即将到来的 Debian 10 Buster 发布版的新特点
查看>>
iOS 头部视图下拉变大
查看>>
Disruptor并发框架
查看>>
react-hooks 实现简单的评论list
查看>>
【多图警告】学会JavaScript测试你就是同行中最亮的仔(妹)
查看>>
19-04-25
查看>>
一个JAVA程序员成长之路分享
查看>>
30K iOS程序员的简述:如何快速进阶成为高级开发人员
查看>>
Go 夜读 - 每周四晚上 Go 源码阅读技术分享
查看>>
tranform知多少
查看>>
Android电量优化
查看>>
[爬虫手记] 我是如何在3分钟内开发完一个爬虫的
查看>>
【译】Css Grid VS Flexbox: 实践比较
查看>>
iOS 开发知识索引
查看>>
Linux iptables命令
查看>>
webpack的使用
查看>>
干货 | 基于Go SDK操作京东云对象存储OSS的入门指南
查看>>