linux下怎么实现在进程中得到其他进程的信息

linux实现系统调用打印进程信息 在linux中,通过系统调用实现打印出当前进程PID,运行状态等信息,以及父进程的简单信息。若对系统调用过程不了解,可以查看我的博客http://blog.youkuaiyun.com/smilematch/article/details/50299275。 在linux中,进程信息存在task_struct结构体中,若对此不了解,可以参考我的博客http://blog.youkuaiyun.com/smilematch 阅读详情

在Linux上要获取进程的信息,需要读取/proc/进程id/中的文件,如果只是读一个进程还好,如果要读取很多进程,或者说像进程管理器一样要获取所有进程的信息就有点麻烦了。总不能按1-1000一个一个的遍历,效率太低。此时可以使用Linux中对目录进行操作的函数opendir(),readdir()。

转自http://www.liweifan.com/2012/05/13/linux-system-function-files-operation/

首先说说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;
}
ps命令-显示Linux进程信息 ps命令是process status的缩写 ps命令主要用来显示Linux进程信息,进程信息主要包括进程用户、pid、内存、cpu、启动时间、路径、终端等。 主要用途 查看进程有没有启动、查看进程的pid并使用kill命令杀掉,查看哪些进程占用的cpu,查看哪些进程占用内存高、查看进程的状态。 ps命令,有两种形式一种是Linux形式(ps -ef),一种是unix形式(ps aux),两种效果一样,aux结果展示更直观。 ps aux ... 阅读详情

相关推荐

Linux进程间通信:实现进程间信息传递与通信

在上述代码中,首先使用shmget()函数创建一个共享内存段,然后使用shmat()函数将该段连接到进程的地址空间。父进程使用sprintf()函数向共享内存写入数据,子进程使用printf()函数从共享内存中读取数据,并在控制台输出。父进程使用write()函数向管道写入数据,子进程使用read()函数从管道中读取数据,并在控制台输出。在上述代码中,首先使用ftok()函数生成一个唯一的键值,然后使用msgget()函数创建一个消息队列。通过管道、共享内存和消息队列,进程可以在运行时进行信息交换和协作。

JwxDjango的博客 97

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

在Linux上要获取进程的信息,需要读取/proc/进程id/中的文件,如果只是读一个进程还好,如果要读取很多进程,或者说像进程管理器一样要获取所有进程的信息就有点麻烦了。总不能按1-1000一个一个的遍历,效率太低。此时可以使用Linux中对目录进行操作的函数opendir(),readdir()。 转自http://www.liweifan.com/2012/05/13/linux-syst...

weixin_30257433的博客 195

获取当前进程信息的方法——Linux内核代码实现

在Linux内核代码中,获取当前进程的信息是一项非常重要的任务。通过访问任务结构体中的各种成员,可以获得想要的进程信息。本文提供了获取当前进程PID、进程名、状态、优先级和调度策略等信息的代码实现,希望能够对从事内核代码开发的读者有所帮助。在内核代码中获取当前进程的信息,首先需要获取当前进程对应的任务结构体,任务结构体在内核代码中表示了进程的各种信息。在Linux内核代码中,获取当前进程的信息非常重要。本文将介绍如何通过内核代码实现获取当前进程信息,并提供相应的代码实现。三、获取当前进程的进程名。

uote_e的博客 984

Linux系统编程-进程间通信

linux进程间通信

qq_52902991的博客 395

实战:一个脚本实现统计linux进程相关的信息

公司实战:统计服务器进程相关的信息

互联网老辛 2786

linux c 获得当前进程的进程名和执行路径(示例)

如何得到当前进程的进程名和执行路径。写了个程序分享一下

Linux:查询当前进程或线程的资源使用情况

proc 目录是一个特殊的虚拟文件系统,它提供了对内核运行时信息的访问,包括进程、设备、网络、文件系统等各个方面的信息。它不是一个真正的文件系统,而是基于内核数据结构的一个接口,通过这个接口可以获取系统的运行时状态。:此目录以进程的 ID(PID)命名,并包含与该进程有关的文件和目录,如之前所讲的 /proc/pid/目录。:该文件包含有关 CPU(处理器)的信息,如厂商、型号、频率、缓存等。:该文件包含有关系统内存的信息,如总内存、可用内存、缓存、交换分区等。

小嵌同学的博客 5557

STM32F407 步进电机S形曲线加减速

步进电机

smallerlang的博客 1591

Linux使用C语言获取进程信息

在计算机的世界里,Linux进程是一个非常基础而且关键的概念。它可以被理解为正在执行的一个程序的实例。每个进程都有自己独特的身份,我们称之为进程ID(PID),就像每个人都有自己的身份证号码一样。Linux操作系统是一种多任务操作系统,可以同时运行多个进程,就像一个杂技团队能同时上演多个节目一样。现在,想象一下进程是厨房里的一个厨师,而计算机资源(如CPU、内存)则是厨房里的炉子、锅碗瓢盆。每个厨师都需要这些资源来完成他们的烹饪任务。

梅花香自苦寒来,宝剑锋从磨砺出。 3343

手把手教你实现阿克曼ROS小车的运动控制

本文详细介绍了如何从零开始实现阿克曼ROS小车的运动控制。内容涵盖硬件搭建、STM32底层PID速度与舵机控制、ROS层阿克曼运动学模型解析,以及上下位机通信协议设计。通过手把手的代码示例和调试步骤,帮助机器人爱好者与开发者掌握将高级速度指令转化为小车具体动作的全流程,实现流畅的阿克曼转向控制。

weixin_29193259的博客 199

模块学习(一)——编码电机

编码电机测速

qq_51406846的博客 7911

Linux C 获取进程的 CPU 和内存数据

Linux C 获取进程的 CPU 和内存数据

myw31415926的专栏 4564

数据可视化—power bi 基础操作汇总

数据来源: https://pan.baidu.com/s/1U_Y7rKfhnSKbLmh4FcUD_Q 提取码: yq5v 目录 基本功能与视图 编辑与查询—修改column案例 建立关联性 新增column与DAX完成总价运算 习题练习1:建立可视化图表 产品销售统计图 column拖曳可视化 1.基本功能与视图 ①基础操作界面 ②获取数据—以打开excel为例 ③数据文件基本视图 可视化形式:柱状图、数据、关联性 2.编辑与查询—修改column ①编辑与查询—数据处理界面 .

weixin_52730784的博客 2682

QT实现Linux下系统监控CPU、内存、进程信息小工具

QT实现Linux下系统监控小工具 QT实现Linux下系统监控小工具 前段时间在做linux操作系统的实验,其中有一个实验要求读取linux系统/proc文件目录下的cpu、内存、和进程的相关信息。并计算CPU使用率,内存使用率。 例如在终端输入 #cat /proc/stat 获得的信息。 #cat /proc/meminfo 需要访问文件夹/proc/stat , /proc/meminfo , /proc/[进程号]/stat; 配置和环境 Ubuntu 18.04操作系统; VMware

weiyi_7914的博客 4725

x2-DFD:A framework for explainable and explainable deepfake detection

该文章提出了X2-DFD框架,用于可解释和可扩展的深度伪造检测。通过评估大型多模态语言模型(MLLMs)在深度伪造检测中的内在能力,发现它们在不同伪造相关特征上的有效性各异。基于此,实施了针对性的微调策略,显著提高了MLLMs的解释能力,并整合了外部深度伪造检测器(EDDs),以结合MLLMs和传统检测器的互补优势,实现更好的检测和解释。

志在山顶的人,不会贪念山腰的风景 510

Android 13.0 Launcher3中去掉Hotseat功能实现

在13.0系统产品定制化开发中,在Launcher3的定制化需求也是特别多的,由产品是小屏幕的产品,所以产品需求Launcher3 页面布局的原因,要求Launcher3 需要去掉Hotseat 不显示Hotseat下面几个图标,而做满屏app的显示,从而达到美观的效果,下面就来分析去掉Hotseat从而实现这个功能

安卓兼职framework和app工程师的博客 1327

shell脚本 实现Linux进程数量信息

脚本如下: [root@localhost shell]# vim linuxprocess.sh  #!/bin/bash running=0     -----用于统计正在运行的程序 sleeping=0     -----用于统计正在睡眠的进程,但可被唤醒 stoped=0        -----用于统计停止的程序 zombie=0        ------用于统计僵尸程序,进程已经终...

朱海燕的博客日记 2310

EuROC 数据集格式及相关代码

Euroc提供ROS和zip两种数据格式。

~勿据散客~的博客 2093

linux查看进程静态信息命令,静态查看进程信息 -- 基于 ps 命令实现

1、简介目前 可以 通过 很多种方式 查看 系统进程,top之类的 工具 可以 动态 的获取 进程信息,今天 介绍 静态 获取 进程信息的 工具 -- ps(当然,静态 获取 进程信息 这类工具 肯定 不止 ps,还有 pstree...)1.1 进程状态###### 进程状态 可以 是单个状态,也可以是 多个 状态的组合,例如 Ss、S<##### R -- Running.运行中#...

weixin_31880681的博客 2041

把 ABAP 选择屏幕 Selection Screen 打造成可维护的交互面板:常用屏幕元素与动态控制全解析

本文详细介绍了ABAP报表中Selection Screen的设计技巧,包括空行(SKIP)、横线(ULINE)、注释(COMMENT)等基础元素的使用方法,以及如何通过MODIF ID实现动态界面调整。重点讲解了行内布局(BEGIN OF LINE)、按钮(PUSHBUTTON)和区块(BLOCK)等高级功能,帮助开发者将选择屏幕从"能用"提升到"好用、易扩展、可维护"的水平。文章还分享了项目实践中的命名规范和分组策略,特别适合需要优化ABAP报表用户体验的开发人员

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 332

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

linux c 进程信息,Linux系统下输出某进程内存占用信息的c程序实现

在实际工作中有时需要程序打印出某个进程的内存占用情况以作参考, 下面介绍一种通过Linux下的伪文件系统/proc 计算某进程内存占用的程序实现方法.首先, 为什么会有所谓的 伪文件 呢. Linux系统的文件类型大致可分为三类: 普通文件, 目录文件和伪文件. 伪文件不是用来存储数据的, 因此这些文件不占用磁盘空间, 只是存在于内存中. /proc 让你可以与内核内部数据进行交互, 获取有关进程...

weixin_39553776的博客 377

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Shell实现Linux进程间信息交换的几种方法

Shell实现Linux进程间信息交换的几种方法(1)<br />2008-12-2 13:40|查看数: 865 <br />本文将介绍在SCO OpenServer5.0.5系统中使用shell语言来实现进程间信息交换的几种方法: <br />使用命名管道实现进程间信息交换 <br />使用kill命令和trap语句实现进程间信息交换 <br />使用点命令“.”实现进程间信息交换 <br />使用export语句实现父进程对子进程的信息传递 <br />一、使用命名管道<br />命名管道是一种先进先

uunubt的专栏 840

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

linux shell实现统计 /proc 目类下Linux进程相关数量信息,输出总进程数,running 进程数,stopped 进程数,sleeping进程数,zombie进程数

linux shell实现统计 /proc 目类下Linux进程相关数量信息,输出总进程数,running 进程数,stopped 进程数,sleeping进程数,zombie进程数

z19861216的博客 664

Linux下创建管道文件,并实现两个进程间的信息传递。

第一步创建管道文件:fifo.c #include #include #define PATH "/home/bencai/4-4/swap" int main(int *argc,char **argv) { int ret; ret=mkfifo(PATH,0644); if(ret!=0) { printf("创建管道失败!\n")

#维多利亚的秘密# 2497

所有进程的信息 linux,LINUX下获取所有进程信息

先上代码:process.h/** process.h** Created on: 2013-5-7* Author: jason*/#ifndef PROCESS_H_#define PROCESS_H_#include#include#include#include#includetypedef struct{pid_t pid;char name[256];//进程名称int v...

weixin_34632164的博客 255
上一篇: 动态内存管理的简单实现(适用于裸机环境即没有c标准库的环境)
下一篇: linux下通过共享内存在进程之间实现通信(system V)
five_kill
博客等级 码龄12年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值