问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Linux下怎么读取多个进程的信息

发布网友 发布时间:2022-04-23 01:53

我来回答

1个回答

热心网友 时间:2023-07-04 00:29

首先说说DIR这一结构体,以下为DIR结构体的定义:

struct __dirstream
{
void *__fd;
char *__data;
int __entry_data;
char *__ptr;
int __entry_ptr;
size_t __allocation;
size_t __size;
__libc_lock_define (, __lock)
};

typedef struct __dirstream DIR;

DIR结构体类似于FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息(摘自《UNIX环境高级编程(第二版)》)。函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用:

struct dirent *readdir(DIR *dp);

void rewinddir(DIR *dp);

int closedir(DIR *dp);

long telldir(DIR *dp);

void seekdir(DIR *dp,long loc);

关于DIR结构,我们知道这么多就可以了,没必要去再去研究他的结构成员。
接着是dirent结构体,首先我们要弄清楚目录文件(directory file)的概念:这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针(摘自《UNIX环境高级编程(第二版)》)。从定义能够看出,dirent不仅仅指向目录,还指向目录中的具体文件,readdir函数同样也读取目录下的文件,这就是证据。以下为dirent结构体的定义:

struct dirent
{
long d_ino; /* inode number 索引节点号 */
  
off_t d_off; /* offset to this dirent 在目录文件中的偏移 */
  
unsigned short d_reclen; /* length of this d_name 文件名长 */
  
unsigned char d_type; /* the type of d_name 文件类型 */
  
char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
}

然后是怎么使用它读取进程信息。可以用这些函数来读取/proc下的文件夹,然后做一个判断,只要文件夹的名字开头是1-9的,就进入目录读取其中的status文件,然后输出信息。

代码

#include <stdio.h>
#include <dirent.h>
#include <unistd.h>
#include <stdlib.h>

typedef struct{
pid_t pid;
char name[256];//进程名称
int vmsize;//虚拟内存信息
}proc_info_st;//保存读取的进程信息

#define PROC_NAME_LINE 1//名称所在行
#define PROC_PID_LINE 4//pid所在行
#define PROC_VMSIZE_LINE 12//虚拟内存所在行
#define BUFF_LEN 1024 //行缓冲区的长度

#ifndef TRUE
# define TRUE 1
#endif

#ifndef FALSE
# define FALSE 0
#endif

void read_proc(proc_info_st* info,const char* c_pid);//读取进程信息
int read_line(FILE* fp,char* buff,int b_l,int l);//读取一行

int main()
{
//打开目录
DIR *dir;
struct dirent *ptr;
if (!(dir = opendir("/proc")))
return 0;
//读取目录
while (ptr = readdir(dir))
{//循环读取出所有的进程文件
if (ptr->d_name[0] > '0' && ptr->d_name[0] <= '9')
{
//获取进程信息
proc_info_st info;
read_proc(&info,ptr->d_name);//读取信息
printf("pid:%d\npname:%s\nvmsize:%d\n",info.pid,info.name,info.vmsize);
printf("\n\n");//再空两行
}
}
}

/**************************************************
**说明:根据进程pid获取进程信息,存放在proc_info_st结构体中
**
**输入:
** /proc_info_st* info 返回进程信息
** /char* c_pid 进程pid的字符串形式
**
**
**
*************************************************/
void read_proc(proc_info_st* info,const char* c_pid)
{
FILE* fp = NULL;
char file[512] = {0};
char line_buff[BUFF_LEN] = {0};//读取行的缓冲区

sprintf(file,"/proc/%s/status",c_pid);//读取status文件
if (!(fp = fopen(file,"r")))
{
printf("read %s file fail!\n",file);
return;
}

char name[32];
//先读取进程名称
if (read_line(fp,line_buff,BUFF_LEN,PROC_NAME_LINE))
{
sscanf(line_buff,"%s %s",name,(info->name));
}

fseek(fp,0,SEEK_SET);//回到文件头部
//读取进程pid
if (read_line(fp,line_buff,BUFF_LEN,PROC_PID_LINE))
{
sscanf(line_buff,"%s %d",name,&(info->pid));
}

fseek(fp,0,SEEK_SET);//回到文件头部
//读取进程vmsize
if (read_line(fp,line_buff,BUFF_LEN,PROC_VMSIZE_LINE))
{
sscanf(line_buff,"%s %d",name,&(info->vmsize));
}

fclose(fp);

}

/**************************************************
**说明:读取文件的一行到buff
**
**输入:
** /FILE* fp 文件指针
** /char* buff 缓冲区
** /int b_l 缓冲区的长度
** /l 指定行
**
**输出:
** /true 读取成功
** /false 读取失败
*************************************************/
int read_line(FILE* fp,char* buff,int b_l,int l)
{
if (!fp)
return FALSE;

char line_buff[b_l];
int i;
//读取指定行的前l-1行,转到指定行
for (i = 0; i < l-1; i++)
{
if (!fgets (line_buff, sizeof(line_buff), fp))
{
return FALSE;
}
}

//读取指定行
if (!fgets (line_buff, sizeof(line_buff), fp))
{
return FALSE;
}

memcpy(buff,line_buff,b_l);

return TRUE;
}
如果你想更深入的了解一些东西可以参考下http://www.linuxprobe.com/chapter-09.html,希望能对你有帮助
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 得了乳腺纤维腺瘤怎么治疗?一定要手术治疗吗? word文档2021和2007哪个好用 乳腺纤维瘤什么情况下要做手术?麻烦告诉我 文咏珊和杨颖怎么了 怎样把word2003变成2021版本? 文咏珊点赞杨颖上了热搜,你知道这两个人是什么关系吗? 乳腺纤维瘤一定要手术吗? word2021里面每行后面都有个小箭头是什么意思? 乳腺瘤做微创还是手术呢? 文咏珊结婚了,Angelababy作为昔日的好姐妹会送上祝福吗? Word2021渐变变填充–金色,强调文字4映像 乳腺瘤要手术吗 手机上微信聊天信息已经删除了,还能去移动公司打印出来吗? 家世背景曝光让所有人大吃一惊,文咏珊究竟有何强大的家庭背景? 乳腺肿瘤一定要手术吗? 在W O 2D 2021中可以使用什么方式创建表格 乳腺肿瘤良性和恶性,是不是都需要手术? 文咏珊和杨颖曾是好姐妹后来友情破裂,文咏珊结婚杨颖还会去吗? word2021能用2013打开吗 文咏珊结婚了!她的粉丝们会给予她什么样的祝福呢? 在Word2021文档中可以插入声音影像等对象 乳腺纤维瘤需要马上手术吗 参加米兰婚礼不报销来宾的路费和食宿,文咏珊嫁了个伪富豪,你怎么看? 怎么查找LINUX的用户进程和后台进程的详细信息!谢谢了 在word中怎样批量将2021年1月23日改为2021年7月9日? 乳腺肿瘤必须手术吗 文咏珊与富二代牵手约会,恋情疑曝光,娱乐圈有哪些嫁入豪门的女星? 2021版office的信息选项在哪里 乳腺肿瘤必须要手术切除吗 文咏珊即将豪华大婚,那么豪华程度上能超越杨颖的“世纪大婚”吗? 你好!微信聊天记录被删除了,现在还能找回吗?我想打印出来 文咏珊曾与谢霆锋一见钟情,陈冠希为追她要戒烟,她究竟是什么存在? linux ps命令显示一个特定的进程信息,如下说明 乳腺瘤要做手术吗 大家知道文咏珊在香港娱乐圈中的人品如何吗? word2021页面低端插入内置 手机摔坏了微信聊天记录删了怎么在电脑导出? 乳腺纤维瘤,大于1cm需要手术吗 baby和文咏珊的关系还像以前一样吗? 乳腺纤维瘤一定要手术吗