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

先用系统函数 `getpwnam` 获得指定用户名的 UID,然后遍历 /proc/ 中所有 PID 目录,如果 /proc/PID/status 中的 UID 是输入用户名对应的 UID 则输出该 status 文件中的进程名,进程ID就是目录名。
#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编程:获取指定用户所有正在运行的进程ID和进程名的更多相关文章
- Linux/UNIX编程如何保证文件落盘
本文转载自Linux/UNIX编程如何保证文件落盘 导语 我们编写程序write数据到文件中时,其实数据不会立马写入磁盘,而是会经过层层缓存.每层缓存都有自己的刷新时机,每层缓存都刷新后才会写入磁盘. ...
- 学习linux/unix编程方法的建议(转)
假设你是计算机科班出身,计算机系的基本课程如数据结构.操作系统.体系结构.编译原理.计算机网络你全修过 我想大概可以分为4个阶段,水平从低到高从安装使用=>linux常用命令=>linux ...
- Linux/UNIX编程:使用C语言实现简单的 ls 命令
刚好把 Linux/UNIX 编程中的文件和IO部分学完了,就想编写个 ls 命令练习一下,本以为很简单,调用个 stat 就完事了,没想到前前后后弄了七八个小时,90%的时间都用在格式化(像 ls ...
- 学习linux/unix编程方法的建议,学习Linux的四个步骤(转)
解答:学习Linux的四个步骤假设你是计算机科班出身,计算机系的基本课程如数据结构.操作系统.体系结构.编译原理.计算机网络你全修过我想大概可以分为4个阶段,水平从低到高从安装使用=>linux ...
- Linux下编程获取本地IP地址的常见方法
转载于:http://blog.csdn.net/k346k346/article/details/48231933 在进行linux网络编程时,经常用到本机IP地址.本文罗列一下常见方法,以备不时之 ...
- linux/unix 编程手册 fork()函数
父进程通过fork()函数创建子进程,将父进程数据段和栈的内容拷贝到子进程中,子进程执行程序execve创建新程序,调用exit函数退出到等待wait(),挂起父进程, 父子进程享用相同的程序文本段. ...
- Linux/Unix编程中的线程安全问题【转】
转自:http://blog.csdn.net/zhengzhoudaxue2/article/details/6432984 在目前的计算机科学中,线程是操作系统调度的最小单元,进程是资源分配的最小 ...
- linux下强制退出指定用户开启的伪终端
一.环境 发行版:Ubuntu 18.04.1 LTS 代号:bionic 内核版本:4.15.0-30-generic 二.背景 每次通过ssh登陆服务器,但是超时后自动断开了与服务器的连接,因此在 ...
- Linux学习之给指定用户发邮件
发送邮件 进入 mail 程序后的操作都很简单,但是可以不进入 mail 的 & 操作提示符界面,下面举几个实用例子: 1.给 snailwarrior@qq.com 发信 [root@pps ...
随机推荐
- [技术翻译]使用Nuxt生成静态网站
本周再来翻译一些技术文章,本次预计翻译三篇文章如下: 04.[译]使用Nuxt生成静态网站(Generate Static Websites with Nuxt) 05.[译]Web网页内容是如何影响 ...
- 小小知识点(三十一)MU-MIMO和SU-MIMO分别表示什么?
MU-MIMO是“Multi-User Multiple-InputMultiple-Output”的缩写,直译为“多用户多入多出技术”. SU-MIMO是“Single-User Multiple- ...
- License for package Android SDK Build-Tools 28.0.3 not accepted
License for package Android SDK Build-Tools 28.0.3 not accepted 用flutter进行编写时出现了标题的错误,不是配置的原因,而是需要接受 ...
- Time、Date拼接成TimeStamp
Time.Date拼接成TimeStamp 有关于Time类型.Date类型的数据这里不再赘述,本文旨在讲解如何将数据库中的Time.Date类型取出来并转换成TimeStamp类型,话不多说,先看代 ...
- java中一些常考知识
一.static的作用 static是修饰符,用于修饰成员变量(静态变量/类变量). static修饰的成员被所有对象共享. static优先于对象存在. static修饰的成员可以用类名.静态成员来 ...
- SQL Server2012高可用之事物复制(发布订阅)测试
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既不可写也不可读,即采用的高可用技术为"数据库镜像".存在的问题为 ...
- floyd + 最大流 (奶牛分配问题)
FJ has moved his K (1 <= K <= 30) milking machines out into the cow pastures among the C (1 &l ...
- 田忌赛马 - dp
Here is a famous story in Chinese history. That was about 2300 years ago. General Tian Ji was a high ...
- SpringCloud之Eureka(服务注册和服务发现基础篇)(二)
一:Eureka简介 Eureka是Spring Cloud Netflix的一个子模块,也是核心模块之一.用于云端服务发现,一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移. ...
- DOCKER学习_017:Docker-Compose介绍
dockers三驾马车 Docker Machine Docker Swarm Docker Compose 一 Docker Compose介绍 Docker Compose是一个定义和运行多容器应 ...