linux 下获取进程ID 和 进程名

本文介绍了一种在Linux环境下通过自定义方法实现进程名与进程ID相互查询的技术方案。该方法利用了shell命令结合文件读写的方式,虽然效率不高,但对于学习进程间通信原理具有一定的参考价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在学进程间通信,但是我一直没找到一个linux 自带的可以根据进程名来获取进程ID的函数,于是就自己写了一个。可以获取到正确的结果,但是是通过system函数,然后 读取文件获得的,效率不高。如果高人看见来,有什么好的建议请提醒我,谢谢。

 

//////////////////////////////////////////////////////////GetProcessAttr.h///////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <iostream>
#include <fcntl.h>
#include <sys/types.h>

class GetProcessAttr
{
public:
    GetProcessAttr();
    ~GetProcessAttr();
    //根据进程名,获取进程ID
    int getProcessId(char *process_name);
    //根据进程ID,获取进程名字
    char* getProcessName(int process_id);
};

 

 

///////////////////////////////////////////////////////GetProcessAttr.cpp////////////////////////////////////////////////

 

#include "GetProcessAttr.h"

GetProcessAttr::GetProcessAttr()
{
}

GetProcessAttr::~GetProcessAttr()
{
}

int GetProcessAttr::getProcessId(char *process_name)
{
    //get process id by shell
    char cmd[100]={0};
    sprintf(cmd,"pidof %s > pid.txt",process_name);
    system(cmd);
    
    //open file
    int fd=open("pid.txt" ,O_RDWR);
    if(fd<0)
    {
        perror("open file failed/n");
        system("rm pid.txt");
        return -1;
    }

    //read file
    char read_buf[50]={0};    
    if(read(fd,read_buf,50)<0)
    {
        perror("read():");
        close(fd)
        system("rm pid.txt");
        return -1;
    }
    
    //close file
    if(close(fd)<0)
    {
        perror("close():");
        system("rm pid.txt");
        return -1;
    }
    //remove file
    system("rm pid.txt");

    return atoi(read_buf);
}

char* GetProcessAttr::getProcessName(int process_id)
{
    //get process name by shell
    char cmd[100]={0};
    sprintf(cmd,"readlink /proc/%d/exe >pname.txt",process_id);
    system(cmd);
    
    //open file
    int fd=open("pname.txt" ,O_RDWR);
    if(fd<0)
    {
        perror("open():/n");
        return NULL;
    }

    //read file
    char *pname = new char[200];    
    if(read(fd,pname,200)<0)
    {
        perror("read():");
        return NULL;
    }
    
    //close file
    if(close(fd)<0)
    {
        perror("close():");
        return NULL;
    }
    //remove file
    system("rm pname.txt");

    return pname;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值