最近在学进程间通信,但是我一直没找到一个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; }