linux编程获取所有进程,Linux/UNIX编程:获取指定用户所有正在运行的进程ID和进程名...

a535edf00d1f7f821dcd19bbbed0ca51.png

先用系统函数 `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("readdir");

exit(EXIT_FAILURE);

}

closedir(dir);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值