如何在Linux下通过C++程序获取ps -ef | grep “****” 的执行结果,并分解其中的进程号,废话少说,直接上代码:
#include <stdio.h>   
#include <string.h>   
#include <stdlib.h>   
#include <string>   
#include <map>   
#include <cstdlib>   
#include <iostream>   
  
using namespace std;  
  
map<string,string> pmap;  
  
int prep_map(map<string,string> &pmap){  
      
    FILE *pstr;   
    char cmd[128],buff[512],*p;  
    int iPID;  
    const char *name= "mongod";//要查找的进程名   
  
    int pidPosition=1;  
    int pInfoPosition=7;  
      
    memset(cmd,0,sizeof(cmd));  
      
    sprintf(cmd, "ps -ef | grep mongod | grep -v \"grep\" | grep fork | awk '{printf $2;printf \"|\";for(i=8;i<=NF;i++)printf\"%s \",$i;printf\"\\n\"}'",name);  
    pstr=popen(cmd, "r");  
      
    if(pstr==NULL)  
    {  
        return 1;   
    }  
  
    memset(buff,0,sizeof(buff));  
  
    while( 1 )  
    {  
        fgets(buff,512,pstr);  
        if(feof(pstr))  
        {  
            break;  
        }  
        printf("buffer=%s",buff);  
        p = strtok(buff, " ");  
        int iPos=0;  
        string strPInfo;  
        while(NULL != p)  
        {  
            if(pidPosition == iPos)  
            {  
                iPID = atoi(p);  
                printf("pid=%d \n", iPID);  
            }  
            if(iPos >= pInfoPosition)  
            {  
                strPInfo += p;  
                strPInfo += " ";  
            }  
            iPos++;  
            p=strtok(NULL, " ");  
              
            string iPID_str = iPID+"";  
  
            pmap.insert(map<string,string>::value_type(iPID_str,strPInfo.c_str()));  
  
        }  
        printf("pInfo = %s \n", strPInfo.c_str());  
    }  
    pclose(pstr);  
    return 1;  
}  
  
int main()  
{  
    prep_map(pmap);  
      
    map<string,string>::iterator it;  
  
    for(it = pmap.begin();it != pmap.end();it++)  
    {  
        cout << "---pid is : " << it->first << endl;  
        cout << "---cmd is : " << it->second << endl;  
    }  
} 
